编辑 我离开的情况下,它是有用的人的问题,但现在看来,这竟是dplyr
版中的问题[见下文] 。dplyr ::从另一个数据帧上的不同列多个条件变异
在R
和使用dplyr
,我有两个数据帧df1
和df2
:
library(dplyr)
set.seed(2)
df1 = data.frame(letter=rep(letters[1:2], each=5), min=runif(10))
df1 = mutate(df1, max=min+runif(10))
df2 = data.frame(letters=rep(letters[1:2], 25), position=runif(50), val=rnorm(50))
对于df1
每一行,我想计算所有df2$val
其中df2$position
是df1$min
和之间的总和df1$max
AND df2$letters
等于df1$letter
。
从this question on SO,我可以做调理的第一部分(即和,df2$position
之间df1$min
df1$max
):
incompleteCond = df1 %>% rowwise %>%
mutate(sumval = sum(df2$val[between(df2$position, min, max)]))
但这不保证df2$letters
与同意的df2
满足这个条件的行总结相应的df1$letter
。我怎样才能在这个其他列上添加这个条件? 以下尝试不起作用:
# Note: these solutions actually DO the job with dplyr_0.4.3!
wrong1 = df1 %>% rowwise %>%
mutate(sumval =
sum(df2$val[between(df2$position, min, max) & df2$letters==letter]))
wrong3 = df1 %>% rowwise %>%
mutate(sumval =
sum(df2[(df2$position>=min) & (df2$position<=max) & (df2$letters==letter),
'val']))
编辑
看起来这实际上是版本的问题:从dplyr_0.4.1
去dplyr_0.4.3
解决了这个问题,它意味着:上面的wrong1
和wrong3
实际上是正确的(它们只给出版本为0.4.1
的零)。
作为一个方面说明,我还没有找到dplyr
的唯一解决方案 - 子集(filter
)df2
,但上述工作,以及@ r2evans的好回答也是如此。
为什么不加入这两个数据集的第一? – aosmith
为什么倒票?没有可重现的数据?有。没有研究工作?我真的做到了。重复?请链接。愚蠢的问题?我的确被愚蠢地阻止了一段时间,很快就需要一个解决方案 - 这是否是错误的用法?对于赞成倒票的几句解释是值得欢迎的,并且至少可以让它具有建设性。 – ztl
谢谢@aosmith。因为我对此并不熟悉,所以没有真正意识到如何去做。感谢您的建议,并感谢r2evans的例子。 – ztl