【问题标题】:R ddply with multiple variables具有多个变量的 R ddply
【发布时间】:2014-03-07 01:32:52
【问题描述】:

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

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),从所有阶段(阶段 1 到阶段 3)中减去阶段 3,这将使 mm(1-3)处于阶段 1全部 -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

【问题讨论】:

  • 您的公式应该类似于 ddply(df, .(ID, variable), transform, mm1 = phase - mm1, mm2 = ...),但我无法弄清楚您是如何从样本数据中获得所需输出的

标签: r plyr


【解决方案1】:

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

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(转置),因为向量回收是按列进行的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-10-01
    • 2020-10-02
    • 2013-07-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-09
    • 1970-01-01
    相关资源
    最近更新 更多