r-案例的聚合变量

  • 本文关键字:变量 案例 r dplyr
  • 更新时间 :
  • 英文 :


你好,Overflowers,

目标是在一个童话般的大数据集上处理数据操作的某些步骤。在第一步中,代表某一信息的不同情况的某些变量应针对每个情况进行汇总。总有5个变量需要聚合。

现在,数据集看起来是这样的:

a1 a2 a3 a4 a5 b1 b2 b3 b4 b5 ... xyz5 A B C 
case1 3  4  7  9  6  21 13              4    1 7 8 
case2 9  12 8        17 25 31           7    2 7 6
case3 5  3  11 10    32 19 13           5    1 6 8
...

它应该看起来像这个

mean-a  mean-b ...mean-xyz A B C 
case1 5,8     17        6,4      1 7 8 
case2 9,6     24,3      8,3      2 7 6
case3 7,25    21,3      7        1 6 8
...

我不确定从dplyr包构建函数或使用across函数是否是正确的方法,因为大约有2000个变量需要聚合。

任何帮助都将不胜感激。

提前感谢!

您还可以使用以下解决方案:

library(dplyr)
library(stringr)
library(purrr)
# First we extract the unique letter values of column names
letters <- unique(str_remove(names(df), "\d"))
[1] "a" "b"   

# Then we iterate over each unique values and extract the columns that contain that unique letter
letters %>%
map(~ df %>% 
select(contains(.x)) %>% 
rowwise() %>%
mutate("mean_{.x}" := mean(c_across(contains(.x)), na.rm = TRUE))) %>%
bind_cols() %>%
relocate(contains("mean"), .after = last_col())

# A tibble: 3 x 12
# Rowwise: 
a1    a2    a3    a4    a5    b1    b2    b3    b4    b5 mean_a mean_b
<dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>  <dbl>  <dbl>
1     3     4     7     9     6    21    13     7     8     4    5.8   10.6
2     9    12     8    17    25    31     4     2     2     7   14.2    9.2
3     5     3    11    10    32    19    13     2     2     5   12.2    8.2

数据

df <- tribble(
~a1, ~a2, ~a3, ~a4, ~a5, ~b1, ~b2, ~b3, ~b4, ~b5,
3, 4, 7, 9, 6, 21, 13, 7, 8, 4, 
9, 12, 8, 17, 25, 31, 4, 2, 2, 7,
5, 3, 11, 10, 32, 19, 13, 2, 2, 5
)

示例数据:

# toy data
library(data.table)
m <- matrix(1:30, ncol = 10)
colnames(m) <- c(paste0('a', 1:5), paste0('b', 1:5))
d <- data.table(m)
d
a1 a2 a3 a4 a5 b1 b2 b3 b4 b5
1:  1  4  7 10 13 16 19 22 25 28
2:  2  5  8 11 14 17 20 23 26 29
3:  3  6  9 12 15 18 21 24 27 30

确定组:

您可以首先确定要聚合的组。

groups <- split(colnames(d), gsub("\d", "", colnames(d)))
groups
$a
[1] "a1" "a2" "a3" "a4" "a5"
$b
[1] "b1" "b2" "b3" "b4" "b5"

骨料

然后,你只需计算每组的平均值。

> d[,lapply(groups, function(i) {rowMeans(d[, i, with = FALSE])})]
a  b
1: 7 22
2: 8 23
3: 9 24

最新更新