【问题标题】:Apply function across rows over a subset in R在 R 中的子集上跨行应用函数
【发布时间】:2016-04-11 17:11:16
【问题描述】:

提前道歉,因为我确定之前已经提出过这个问题,但我正在寻找一种有效的方法来最好地使用数据表包来做到这一点。

我有一个矩阵,如果可以使用包完成,它可以是一个数据表,其中包含我需要按列分组的数据,但在每组列的行中应用 mean 函数。最终结果应该是一个矩阵(或数据表),其中包含基于组平均值的列。

set.seed(123)
testMatrix <- matrix(nrow = 15, ncol = 10)
for (i in 1:nrow(testMatrix)) {
    testMatrix[i,] <- runif(1) 
}

我知道这些值都是相同的,但这并不重要。所以现在我需要找到各行的平均值,但对于每对列。所以最终结果应该是一个 5 列 15 行的数据表,V1、V2 和 V3、V4 之间的所有行的平均值等。第 1 列将有 15 个值,即所有行之间的平均值前两列等等。该方法将被合并到一个循环中以自动化超过 100 个数据集,因此效率很重要。

【问题讨论】:

  • 这个很高效(df1[c(F,T)] + df1[c(T,F)])/2想法来自stackoverflow.com/questions/33026944/…
  • 如果你想使用矩阵,这个问题涵盖了它:stackoverflow.com/q/36432686
  • 该方法也适用于矩阵(testMatrix[,c(F,T)] + testMatrix[,c(T,F)]) / 2
  • 但是如果我要跨多个列应用,比如说两个以上,那么我必须为每一列写出来吗?所以我拥有的数据集实际上是 35 列,我需要按 7 分组。会是(df1[c(F,T)] + df1[c(T,F)]) + df1[c(F,T)] + etc/7 吗? @PierreLafortune
  • 难道没有办法使用rowMeansdata.table 中的东西吗?我听说过cut 功能,但从未使用过。 @PierreLafortune

标签: r data.table grouping subset


【解决方案1】:

我们可以按组对数据进行拆分,并找到每个数据的行均值。

#Split using integer division and a generic level generator
grps <- split(1:ncol(df), gl(ncol(df) %/% 7, 7))

#Find mean of each grouped row
sapply(grps, function(ind) rowMeans(df[,ind]))
#              1         2         3         4         5
# [1,]  45.71143  45.71143  45.71143  45.71143  45.71143
# [2,]  45.82786  45.82786  45.82786  45.82786  45.82786
# [3,]  36.08286  36.08286  36.08286  36.08286  36.08286
# [4,]  60.16214  60.16214  60.16214  60.16214  60.16214
# [5,]  83.61571  83.61571  83.61571  83.61571  83.61571
# [6,]  54.36286  54.36286  54.36286  54.36286  54.36286
# [7,]  92.84571  92.84571  92.84571  92.84571  92.84571

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-07-13
    • 1970-01-01
    • 2015-09-28
    • 2015-10-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多