dplyr::在另一个数据帧的不同列上使用多个条件进行变异
编辑 我留下这个问题,以防对某人有所帮助,但这似乎实际上是dplyr::在另一个数据帧的不同列上使用多个条件进行变异,r,dplyr,R,Dplyr,编辑 我留下这个问题,以防对某人有所帮助,但这似乎实际上是dplyrversion[见下文]的问题 在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]
dplyr
version[见下文]的问题
在
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
和df2$letters
等于df1$letter
从中,我可以执行调节的第一部分(即df2$position
介于df1$min
和df1$max
之间):
但这是对满足此条件的df2
行求和,而不确保df2$letters
与相应的df1$letters
一致。如何在另一列中添加此条件?
以下尝试无效:
# 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.3中起作用!
错误1=df1%>%rowwise%>%
突变(sumval=
总和(df2$val[介于(df2$position,min,max)和df2$letters==letter]))
错误3=df1%>%rowwise%>%
突变(sumval=
sum(df2[(df2$position>=min)&(df2$position我认为你很接近:
df1 %>%
rowwise() %>%
mutate(sumval = sum( df2$val[df2$letters == letter & between(df2$position, min, max)] ))
## Source: local data frame [10 x 4]
## Groups: <by row>
## letter min max sumval
## (fctr) (dbl) (dbl) (dbl)
## 1 a 0.1848823 0.7375563 -3.8432366
## 2 a 0.7023740 0.9412688 -0.9138266
## 3 a 0.5733263 1.3338396 4.1341039
## 4 a 0.1680519 0.3488720 -2.5142686
## 5 a 0.9438393 1.3491215 3.6405305
## 6 b 0.9434750 1.7970234 -0.1416608
## 7 b 0.1291590 1.1055575 -5.2083130
## 8 b 0.8334488 1.0592743 1.0618699
## 9 b 0.4680185 0.9128277 -2.3595283
## 10 b 0.5499837 0.6249632 0.0000000
为什么不先加入这两个数据集?为什么会有反对票?没有可复制的数据?有。没有研究工作?我真的做了。重复?请链接。愚蠢的问题?我确实被愚蠢地阻止了一段时间,需要一个快速的解决方案-这是一个错误的用法吗?!欢迎对反对票说几句解释并提出建议至少在某种程度上是有建设性的。谢谢@aosmith。因为我不熟悉这一点,所以不知道怎么做。谢谢你的建议,也谢谢r2evans的例子。我在这个和更大的数据集上做了一个快速的microbenchmark
(事实上是我自己做的),对于较小的数据集,rowwise
方法看起来稍微快一点;但是对于较大的数据集,join
方法速度更快,时间减少了40%。并不是说基准测试就是一切,但是如果您有大量数据,可能会首选第二个更详细的代码。谢谢@r2evans.Solution2工作正常,但非常奇怪的是,解决方案1给了我一个只带零的sumval
列…?!当我在原始数据集上搜索解决方案时也发生了这种情况…您使用的是dplyr
的哪个版本?[注意:对于解决方案1,第3行是df2$letters
(缺少“s”),对吗?]实际上,@r2evans,您的解决方案1与我的errow1
有何不同?检查一下,errow1
也只会给我零,就像您的解决方案1一样(它们确实看起来与我相同,超出了条件的顺序).因此,两者似乎都没问题,现在的问题是要理解为什么它会对我如此……有什么想法/建议吗?我遗漏了什么吗?我从你的问题和我的解决方案1中复制了数据代码,但我没有得到一列零。(我的解决方案1中的错误被“捕获”)因为data.frame列匹配会进行部分匹配,所以dodf2$lett
也会起作用。为了清晰起见,我会在答案中对其进行修正,尽管它不会改变结果。)我已经包含了我的会话信息。非常感谢@r2evans。请问我的错误1
是否能为您提供与您的解决方案1相同的结果?为什么它对我不起作用仍然是个谜。有待进一步调查……无论如何,我很高兴了解您的解决方案2,它也很棒!
df1 %>%
rowwise() %>%
mutate(sumval = sum( df2$val[df2$letters == letter & between(df2$position, min, max)] ))
## Source: local data frame [10 x 4]
## Groups: <by row>
## letter min max sumval
## (fctr) (dbl) (dbl) (dbl)
## 1 a 0.1848823 0.7375563 -3.8432366
## 2 a 0.7023740 0.9412688 -0.9138266
## 3 a 0.5733263 1.3338396 4.1341039
## 4 a 0.1680519 0.3488720 -2.5142686
## 5 a 0.9438393 1.3491215 3.6405305
## 6 b 0.9434750 1.7970234 -0.1416608
## 7 b 0.1291590 1.1055575 -5.2083130
## 8 b 0.8334488 1.0592743 1.0618699
## 9 b 0.4680185 0.9128277 -2.3595283
## 10 b 0.5499837 0.6249632 0.0000000
df1 %>%
mutate(grp = 1:n()) %>%
left_join(df2, by=c('letter'='letters')) %>%
filter(position >= min & position <= max) %>%
group_by(grp) %>%
summarize(letter=letter[1], min=min[1], max=max[1], sumval=sum(val)) %>%
select(-grp)
## Source: local data frame [9 x 4]
## letter min max sumval
## (fctr) (dbl) (dbl) (dbl)
## 1 a 0.1848823 0.7375563 -3.8432366
## 2 a 0.7023740 0.9412688 -0.9138266
## 3 a 0.5733263 1.3338396 4.1341039
## 4 a 0.1680519 0.3488720 -2.5142686
## 5 a 0.9438393 1.3491215 3.6405305
## 6 b 0.9434750 1.7970234 -0.1416608
## 7 b 0.1291590 1.1055575 -5.2083130
## 8 b 0.8334488 1.0592743 1.0618699
## 9 b 0.4680185 0.9128277 -2.3595283
sessionInfo()
## R version 3.2.2 (2015-08-14)
## Platform: x86_64-w64-mingw32/x64 (64-bit)
## Running under: Windows 8 x64 (build 9200)
## locale:
## [1] LC_COLLATE=English_United States.1252
## [2] LC_CTYPE=English_United States.1252
## [3] LC_MONETARY=English_United States.1252
## [4] LC_NUMERIC=C
## [5] LC_TIME=English_United States.1252
## attached base packages:
## [1] stats graphics grDevices utils datasets methods base
## other attached packages:
## [1] dplyr_0.4.3
## loaded via a namespace (and not attached):
## [1] compiler_3.2.2 lazyeval_0.1.10 magrittr_1.5 R6_2.1.1
## [5] assertthat_0.1 parallel_3.2.2 tools_3.2.2 DBI_0.3.1
## [9] htmltools_0.2.6 Rcpp_0.12.1 rmarkdown_0.8.1 digest_0.6.8