gpt4 book ai didi

具有多个变量的 R ddply

转载 作者:行者123 更新时间:2023-12-02 11:23:39 26 4
gpt4 key购买 nike

这是我的真实数据集的一个简单数据框:

df <- data.frame(ID=rep(101:102,each=9),phase=rep(1:3,6),variable=rep(LETTERS[1:3],each=3,times=2),mm1=c(1:18),mm2=c(19:36),mm3=c(37:54))

我想首先按ID和变量进行分组,然后对于值(mm1,mm2,mm3),从所有阶段(phase1到phase3)中减去第3阶段,这将使第1阶段中的mm(1-3)全部为-2,第2阶段全部为-1,第3阶段全部为0。

R 抛出错误“Ops.data.frame(x, x[3, ]) 中的错误: - 仅针对同等大小的数据帧定义”正如我所尝试的:

df1 <- ddply(df, .(ID, variable), function(x) (x - x[3,]))   

如有任何建议,我们将不胜感激。输出应如下所示:

ID phase variable mm1 mm2 mm3
101 1 A -2 -2 -2
101 2 A -1 -1 -1
101 3 A 0 0 0
101 1 B -2 -2 -2
101 2 B -1 -1 -1
101 3 B 0 0 0
101 1 C -2 -2 -2
101 2 C -1 -1 -1
101 3 C 0 0 0
102 1 A -2 -2 -2
102 2 A -1 -1 -1
102 3 A 0 0 0
102 1 B -2 -2 -2
102 2 B -1 -1 -1
102 3 B 0 0 0
102 1 C -2 -2 -2
102 2 C -1 -1 -1
102 3 C 0 0 0

最佳答案

好吧,我花了一点时间才弄清楚你想要什么,但这里有一个解决方案:

cols.to.sub <- paste0("mm", 1:3)
df1 <- ddply(
df, .(ID, variable),
function(x) {
x[cols.to.sub] <- t(t(as.matrix(x[cols.to.sub])) - unlist(x[x$phase == 3, cols.to.sub]))
x
} )

这会产生(前 6 行):

    ID phase variable mm1 mm2 mm3
1 101 1 A -2 -2 -2
2 101 2 A -1 -1 -1
3 101 3 A 0 0 0
4 101 1 B -2 -2 -2
5 101 2 B -1 -1 -1
6 101 3 B 0 0 0

一般来说,调试此类问题的最佳方法是将 browser() 语句放入您传递给 ddply 的函数中,这样您就可以检查闲暇时的元素。这样做会揭示:

  1. 传递给函数的数据帧包括 ID 列以及阶段列,因此您的 mm 列不是前三列(因此需要定义 cols.to .sub)
  2. 即使解决了这个问题,您也无法对维度不等的数据帧进行操作,因此我在这里所做的就是转换为矩阵,然后利用向量回收从矩阵的其余部分中减去一行。我需要t(转置),因为矢量回收是按列进行的。

关于具有多个变量的 R ddply,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22239745/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com