我试图在R列表的元素中追加一列值,其中每个元素都有不同的长度。下面是一个列表foo示例:
A B C
1 1 150
1 2 25
1 4 30
2 1 200
2 3 15
3 4 30首先,我将foo分解为list foo,它的元素基于A的每个唯一值。现在,我想写一个函数: a) A的每个值的C和,但b)当B == 4. c时,不包括B)和作为一个新列D附加,d) C除以D得到一个比例(E列)。最终,它将合并到一个新的df中,如下所示:
A B C D E
1 1 150 175 0.857
1 2 25 175 0.143
1 4 30 175 0.171
2 1 200 215 0.930
2 3 15 215 0.070
3 4 30 0 0/NA但是,我遇到了问题,因为在某些情况下,对于给定的A值,只有在B == 4(这里是A == 3)的情况下,所以当我试图将C除以D时,我会得到错误消息。
是否有一种方法将if/else语句合并到函数中,以便当A是唯一且B的唯一可能值为4时,跳过操作,并将默认的非零值放置在附加列中?
将df设置为排除的情况,其中B == 4使以后的操作更加困难,但包括B == 4使和/比例计算不准确的情况。
任何帮助都是非常感谢的!以下是当前代码:
goo <- lapply(foo,function(df){
df$D <- sum(df$C, na.rm = TRUE)
df$E <- df$C / df$D
### .....
df
})发布于 2014-10-14 00:42:03
下面是使用base包的解决方案。
首先,通过将A转换为一个因子(如果它还不是一个因子),确保对数据进行适当的建模:
df$A <- factor(df$A)现在,我们可以使用D来计算tapply,它迭代groupwise并将结果作为t来返回。我们这样做,with,subset of df,B != 4。
df$D <- with(subset(df, B != 4), tapply(C, A, sum))[df$A]注意,由于A是一个因素,我们可以在表中索引以执行合并。现在我们可以使用ifelse计算E了。
df$E <- with(df, ifelse(is.na(D), 0, C/D))https://stackoverflow.com/questions/26348929
复制相似问题