R将函数应用于数据框的子集

标签 r subset

<分区>

我在网上广泛查看,但没有看到这个特定问题的答案(我认为)。

对我来说,最好的 self 解释方式是使用一些代码来重现我的问题。 我做了一些临时数据:

x <- runif(100,1,2)
y <- runif(100,2,3)

z <- c(rep(1,100))
temp <- cbind(x,y,z)

temp[1:25,3] = temp[1:25,3] +2

temp <- as.data.frame(temp)

这就是 temp 的样子

         x        y   z
1   1.512620 2.552271 3
2   1.133614 2.455296 3
3   1.543242 2.490120 3
4   1.047618 2.069474 3
.      .        .     .
.      .        .     .
27  1.859012 2.687665 1
28  1.231450 2.196395 1

它一直持续到数据帧的末尾(100 行)。

我想做的是将函数应用于数据框,但应用于数据的子集。因此,例如,我想在 z=3 时将函数均值应用于列 x 和 y,并在 z=1 时将函数均值应用于列 x 和 y。所以我最终会得到 4 个值:当 z=1 和 z=3 时 x 的平均值以及当 z=1 和 z=3 时 y 的平均值。对于我的实际数据集,当 z= 某个值时的行数变化很大。

我一直在使用以下有效的代码;然而,这让我感到非常不安,因为我觉得代码可以更高效并且最好避免 for 循环。

x <- c(unique(temp$z))

我使用它 ^^ 来获取唯一的 z 值(在本例中为 z=3 和 z=1)。

for(i in x){
  assign(paste("newdata",i,sep=""),subset(temp[which(temp$z==i),],select=c("x","y")))
} 

所以我现在有两个新数据框 newdata1 和 newdata3,它们的行数不同。 newdata1 是 z=1 时的所有值,newdata3 是 z=3 时的所有值。

library(gdata)

blah <-cbindX(newdata1,newdata3)

我再次使用 cbindX 将子集数据合并到一个大数据框中。我不确定我为什么要这样做(我很久以前就写了这段代码)。我只记得这是我在使用上面的 for 循环时让它工作的唯一方法。代码的主要问题是当我有多个 z 值时,手动输入该列表变得非常麻烦。如果 z 的范围从 1 到 50,那么用户将键入 newdata1、newdata2、newdata3 .... 等等。

但是...它确实有效:

summ.test <- apply(blah,2,function(x) { 
c(min(x,na.rm=TRUE),median(x,na.rm=TRUE),max(x,na.rm=TRUE),sum(!is.na(x)))})

         x         y         x         y
[1,]  1.028332  2.018162  1.012379  2.009595
[2,]  1.509049  2.504000  1.427981  2.455296
[3,]  1.992704  2.998483  1.978359  2.970695
[4,] 75.000000 75.000000 25.000000 25.000000

所以我有效地做的是创建一个新的数据框,其中包含我之前从子集化的值,并将感兴趣的函数应用于它们。所以第一行是:当 z=1 时 x 的平均值,当 z=1 时 y 的平均值,当 z=3 时 x 的平均值,当 z=3 时 y 的平均值。

应该相当明显的主要问题:对数据框进行子集化的 for 循环方法会导致比我希望的更多的问题。有什么建议可以完全避免这种情况并最终得到相同的结果吗?

请让我知道这是否令人困惑,或者我的代码是否很草率!仍在处理此网站上的问题格式......

最佳答案

library(data.table)
DT <- as.data.table(temp)
DT[, lapply(.SD, mean), by=z]
   z        x        y
1: 3 1.515801 2.309161
2: 1 1.509637 2.532575

或者使用基础R:

with(temp, cbind(x=tapply(x, z, mean), y=tapply(y, z, mean)))
         x        y
1 1.509637 2.532575
3 1.515801 2.309161

PS,不要忘记设置种子,例如set.seed(1) ;)

关于R将函数应用于数据框的子集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19261159/

相关文章:

r - 查找值等于您的值的子集

r - 如何对每行具有不同列位置的矩阵进行子集化?

arrays - 有选择地使用 drop [R] - 仅删除指定的 length-1 尺寸

javascript - 更改数据表中的列过滤器 "All"标签

r - 如何使用 DPLYR 汇总一列中组的唯一值?

r - 如何根据变量名动态创建 case_when() 表达式?

r - 标准化各组的点大小

algorithm - 查找具有特定子集的集合

r - 超过100个类别的散布堆积条形图

r - R陷阱:逻辑和运算符用于组合条件是&而非&&