i在r中有一个 data.frame
, possibleVotes
看起来像这样(有关生成此数据框架的代码,请参见帖子的结尾,或者在此处(:
+------+------+------+------+------+-------------+--------+------+
| Var1 | Var2 | Var3 | Var4 | Var5 | nSuccesses1 | p1 | use1 |
+------+------+------+------+------+-------------+--------+------+
| 0 | 0 | 0 | 1 | 0 | 0 | 0.0225 | 0 |
+------+------+------+------+------+-------------+--------+------+
| 1 | 0 | 0 | 1 | 0 | 1 | 0.1275 | 0 |
+------+------+------+------+------+-------------+--------+------+
| 0 | 1 | 0 | 1 | 0 | 1 | 0.1275 | 0 |
+------+------+------+------+------+-------------+--------+------+
| 1 | 1 | 0 | 1 | 0 | 2 | 0.7225 | 1 |
+------+------+------+------+------+-------------+--------+------+
我正在尝试使用dplyr
使用这样的代码过滤:
round <- 1
roundTotal <- 2
pRound1 <- possibleVotes %>%
select_(num_range("Var", 1:2), paste0("nSuccesses", round), paste0("p", round), paste0("use", round)) %>%
distinct_() %>%
filter_(paste0("nSuccesses", round) == roundTotal & paste0("use", round) == 1) %>%
select_(paste0("p", round)) %>%
sum()
我的预期结果仅仅是pRound1
为0.7225。不幸的是我遇到了这个错误:
错误:
p1
列必须是1D原子向量或列表
我经历了每个步骤,发现:
- 没有
distinct_()
没有错误。 - 该错误显示在
filter_()
步骤中。 -
num_range()
不起作用(未选择Var1
和Var2
列(
我不知道错误是什么意思,也不知道为什么num_range()
也没有给我预期的结果...
我该如何解决这个问题?谢谢!
编辑:在@axeman的慷慨帮助之后,我尝试了filter_()
:
filter_(lazyeval::interp(~a == b, a = as.name(paste0("nSuccesses", round)), b = roundTotal)) %>%
filter_(lazyeval::interp(~a == b, a = as.name(paste0("use", round)), b = 1))
不幸的是它仍然给出:
错误:
p1
列必须是1D原子向量或列表
编辑2:我正在使用R 3.4.0。
运行dplyr 0.5.0编辑3:这是我用来生成原始possibleVotes
数据框架的完整代码:
possibleVotes <- expand.grid(replicate(5, c(0,1), simplify = FALSE))
pSpecies <- 0.85
round <- 1
roundFor <- 2
roundAgainst <- 0
roundTotal <- roundFor + roundAgainst
possibleVotes[paste0("nSuccesses", round)] <- rowSums(possibleVotes[1:roundTotal])
possibleVotes[paste0("p", round)] <- pSpecies^(possibleVotes[paste0("nSuccesses", round)]) * (1-pSpecies)^(round1Total - possibleVotes[paste0("nSuccesses", round)])
possibleVotes[paste0("use", round)] <- apply(possibleVotes, 1, function(x) if (sum(x[1:roundTotal]) == roundFor) 1 else 0)
一个简单的技巧是paste0
一起创建一个条件,摆脱了其他麻烦的条件构建过程。您可以建立这样的条件:paste0("nSuccesses", round, "==", roundTotal, "&", "use", round, "== 1")
它将为您提供诸如"nSuccesses1==2&use1== 1"
之类的东西,而filter_
则为
编辑:我的所有代码:
dmatrix <- t(matrix(c(0,0,0,1,0,0,0.0225,0,
1,0,0,1,0,1,0.1275,0,
0,1,0,1,0,1,0.1275,0,
1,1,0,1,0,2,0.7225,1), nrow = 8, ncol = 4))
possibleVotes <- data.frame(dmatrix)
colnames(possibleVotes) <- c("Var1","Var2","Var3","Var4","Var5","nSuccesses1","p1","use1")
round <- 1
roundTotal <- 2
pRound1 <- possibleVotes %>%
select_(~num_range("Var", 1:2), paste0("nSuccesses", round), paste0("p", round), paste0("use", round)) %>%
distinct_() %>%
filter_(paste0("nSuccesses", round, "==", roundTotal, "&", "use", round, "== 1")) %>%
select_(paste0("p", round)) %>%
sum()