【问题标题】:How to average across several rows, for many columns, using data.table in R?如何使用 R 中的 data.table 对多行、多列进行平均?
【发布时间】:2023-03-21 05:36:01
【问题描述】:

我有一个数据集,其中成对的行可以在变量 X1 上具有相同的值。我想将 2:40 列中的这些成对行的值平均到每个新的单行中。有没有简单的方法可以做到这一点?

如果它只是我平均的一列,我想我可以这样做:

d[, X2 := X2, by = X1]    

但这对于多列来说变得非常乏味。有没有办法在 data.table 中执行此操作而无需为每一列输入 X := X

编辑:

这是一个可重现的示例。我基本上想以十行结束,每个“猫”值一个。这些行将包含该级别“猫”的 x1、x2 和 x3 的平均值。

cat <- rep(1:10, times = 2)
x1 <- rnorm(20)
x2 <- rnorm(20)
x3 <- rnorm(20)

dat <- cbind(cat, x1, x2, x3)

dat <- as.data.frame(dat)

【问题讨论】:

  • 可能类似于d[, mX := rowMeans(.SD), X1, .SDcols=X2:X40]
  • 那么您只想要唯一的行吗?也许unique(d, by=names(d)) 如果您不想全部使用,您可以在其中专门选择您的by= 列?
  • @RonakShah 现已添加示例数据。

标签: r data.table


【解决方案1】:

我不确定这个解决方案是否适合,因为您没有提供minimal reproducible example,但也许是这样的?

library(data.table)

df <- data.frame(X1 = rep(1:50, each = 2),
                 X2 = rep(x = 1:2, times = 50),
                 X3 = rep(x = 1:2, times = 50),
                 X4 = rep(x = 1:2, times = 50),
                 X5 = rep(x = 1:2, times = 50),
                 X6 = rep(x = 1:2, times = 50),
                 X7 = rep(x = 1:2, times = 50),
                 X8 = rep(x = 1:2, times = 50),
                 X9 = rep(x = 1:2, times = 50),
                 X10 = rep(x = 1:2, times = 50)
                 )
setDT(df)
head(df)
#>    X1 X2 X3 X4 X5 X6 X7 X8 X9 X10
#> 1:  1  1  1  1  1  1  1  1  1   1
#> 2:  1  2  2  2  2  2  2  2  2   2
#> 3:  2  1  1  1  1  1  1  1  1   1
#> 4:  2  2  2  2  2  2  2  2  2   2
#> 5:  3  1  1  1  1  1  1  1  1   1
#> 6:  3  2  2  2  2  2  2  2  2   2

df2 <- df[ ,lapply(.SD, mean), by = X1, .SDcols = X2:X10]
head(df2)
#>    X1  X2  X3  X4  X5  X6  X7  X8  X9 X10
#> 1:  1 1.5 1.5 1.5 1.5 1.5 1.5 1.5 1.5 1.5
#> 2:  2 1.5 1.5 1.5 1.5 1.5 1.5 1.5 1.5 1.5
#> 3:  3 1.5 1.5 1.5 1.5 1.5 1.5 1.5 1.5 1.5
#> 4:  4 1.5 1.5 1.5 1.5 1.5 1.5 1.5 1.5 1.5
#> 5:  5 1.5 1.5 1.5 1.5 1.5 1.5 1.5 1.5 1.5
#> 6:  6 1.5 1.5 1.5 1.5 1.5 1.5 1.5 1.5 1.5

reprex package (v2.0.0) 于 2021-07-16 创建

--

或者这个?

library(data.table)

df <- data.frame(X1 = 1:100,
                 X2 = rep(x = 1:2, times = 50),
                 X3 = rep(x = 1:2, times = 50),
                 X4 = rep(x = 1:2, times = 50),
                 X5 = rep(x = 1:2, times = 50),
                 X6 = rep(x = 1:2, times = 50),
                 X7 = rep(x = 1:2, times = 50),
                 X8 = rep(x = 1:2, times = 50),
                 X9 = rep(x = 1:2, times = 50),
                 X10 = rep(x = 1:2, times = 50)
                 )
setDT(df)
head(df)
#>    X1 X2 X3 X4 X5 X6 X7 X8 X9 X10
#> 1:  1  1  1  1  1  1  1  1  1   1
#> 2:  2  2  2  2  2  2  2  2  2   2
#> 3:  3  1  1  1  1  1  1  1  1   1
#> 4:  4  2  2  2  2  2  2  2  2   2
#> 5:  5  1  1  1  1  1  1  1  1   1
#> 6:  6  2  2  2  2  2  2  2  2   2

df2 <- df[, lapply(.SD, mean, na.rm=TRUE), X1-0:1]
head(df2)
#>    X1  X2  X3  X4  X5  X6  X7  X8  X9 X10
#> 1:  1 1.5 1.5 1.5 1.5 1.5 1.5 1.5 1.5 1.5
#> 2:  3 1.5 1.5 1.5 1.5 1.5 1.5 1.5 1.5 1.5
#> 3:  5 1.5 1.5 1.5 1.5 1.5 1.5 1.5 1.5 1.5
#> 4:  7 1.5 1.5 1.5 1.5 1.5 1.5 1.5 1.5 1.5
#> 5:  9 1.5 1.5 1.5 1.5 1.5 1.5 1.5 1.5 1.5
#> 6: 11 1.5 1.5 1.5 1.5 1.5 1.5 1.5 1.5 1.5

reprex package (v2.0.0) 于 2021-07-16 创建

【讨论】:

  • 完美,非常感谢!为了后代,我在编辑中添加了示例数据。再次感谢!
猜你喜欢
  • 2017-10-04
  • 2019-07-26
  • 2021-12-05
  • 1970-01-01
  • 1970-01-01
  • 2012-09-10
  • 1970-01-01
  • 2015-12-05
  • 2021-04-12
相关资源
最近更新 更多