編輯 我離開的情況下,它是有用的人的問題,但現在看來,這竟是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