R:使用 filter_() 时 dplyr "must be a 1d atomic vector or a list"错误



i在r中有一个 data.framepossibleVotes看起来像这样(有关生成此数据框架的代码,请参见帖子的结尾,或者在此处(:

+------+------+------+------+------+-------------+--------+------+
| 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原子向量或列表

我经历了每个步骤,发现:

  1. 没有distinct_()没有错误。
  2. 该错误显示在filter_()步骤中。
  3. num_range()不起作用(未选择Var1Var2列(

我不知道错误是什么意思,也不知道为什么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()

最新更新