我机智。我试图在我的管道中做一个相当简单的突变,但是对于一个特定的例子,R只是拒绝工作。很抱歉,但我无法提供可复制的示例(由于下面提到的原因)。
所以这是我的全部管道:
new <- old %>%
left_join(., lookup, by = "id") %>%
mutate(sum_0.95 = apply(across(starts_with("pred")), 1, function(x) {sum(x >= 0.95 & x < 1)}),
sum_le_0.5 = apply(across(starts_with("pred")), 1, function(x) {sum(x <= 0.5 & x > 0)}),
coding = case_when(pred_QC4A_code_10 == 0 | pred_QC4A_code_10 == 1 ~ "ABC",
sum_0.95 > 0 & (sum_0.95 + sum_le_0.5 == (lookup %>% select(starts_with("pred")) %>% names() %>% length())) ~ "DEF",
TRUE ~ "XYZ")) %>%
select(-starts_with("pred"), -sum_0.95, -sum_le_0.5)
这会给出错误消息(由于lookup %>% select(starts_with("pred")) %>% names() %>% length()
case_when中的部分)。
# Error: Problem with `mutate()` input `coding`.
# x no applicable method for 'select' applied to an object of class "character"
问题是:
lookup
具有相同结构的其他数据集,它将起作用test <- lookup
并通过管道中的测试替换查找,则可以正常工作test <- dput(lookup)
,和上面一样,就可以的检查identical(test, lookup)
也将返回TRUE
。
这也是我无法为您提供有效示例的原因。因为无论我做什么(例如dput),该错误都无法重现。
至少是str(lookup)
结果
'data.frame': 5625 obs. of 30 variables:
$ id : chr "A" "B" "C" "D" ...
$ pred_QC4A_code_10 : num 1 0 0 1 1 1 1 0 1 1 ...
$ pred_QC4A_code_11 : num 0 0 0 0 0 0 0 0 0 1 ...
$ pred_QC4A_code_12 : num 0 0 0 0 0 0 0 0 0 0 ...
$ pred_QC4A_code_13 : num 0 0 0 0 0 0 0 0 0 0 ...
$ pred_QC4A_code_14 : num 0 0 0 0 0 0 0 1 0 0 ...
$ pred_QC4A_code_15 : num 0 0 1 0 0 0 0 0 0 0 ...
$ pred_QC4A_code_16 : num 0 0 0 0 0 0 0 0 0 0 ...
$ pred_QC4A_code_17 : num 0 0 0 0 0 0 0 0 0 0 ...
$ pred_QC4A_code_20 : num 0 0 0 0 0 0 0 0 0 0 ...
$ pred_QC4A_code_21 : num 0 0 0 0 0 0 0 0 0 0 ...
$ pred_QC4A_code_22 : num 0 0 0 0 0 0 0 0 0 0 ...
$ pred_QC4A_code_23 : num 0 0 0 0 0 0 0 0 0 0 ...
$ pred_QC4A_code_30 : num 0 0 0 0 0 0 0 0 0 0 ...
$ pred_QC4A_code_31 : num 0 1 0 0 0 0 0 0 0 0 ...
$ pred_QC4A_code_32 : num 0 0 0 0 0 0 0 0 0 0 ...
$ pred_QC4A_code_33 : num 0 0 0 0 0 0 0 0 0 0 ...
$ pred_QC4A_code_34 : num 0 0 0 0 0 0 0 0 0 0 ...
$ pred_QC4A_code_40 : num 0 0 0 0 0 0 0 0 0 0 ...
$ pred_QC4A_code_41 : num 0 0 0 0 0 0 0 0 0 0 ...
$ pred_QC4A_code_42 : num 0 0 0 0 0 0 0 0 0 0 ...
$ pred_QC4A_code_43 : num 0 0 0 0 0 0 0 0 0 0 ...
$ pred_QC4A_code_44 : num 0 0 0 0 1 0 0 0 0 0 ...
$ pred_QC4A_code_80 : num 0 0 0 0 0 0 0 0 0 0 ...
$ pred_QC4A_code_995 : num 0 0 0 0 0 0 0 0 0 0 ...
$ pred_QC4A_code_996 : num 0 0 0 0 0 0 0 0 0 0 ...
$ pred_QC4A_code_997 : num 0 0 0 0 0 0 0 0 0 0 ...
$ pred_QC4A_code_998 : num 0 0 0 0 0 0 0 0 0 0 ...
$ pred_QC4A_code_9991: num 0 0 0 0 0 0 0 0 0 0 ...
$ pred_QC4A_code_9992: num 0 0 0 0 0 0 0 0 0 0 ...
我认为这确实与select
命令有关,但不知道发生了什么。
更新:解决了问题。问题是,在我的new
数据框中,我还有一个名为的列lookup
,因此case_when在访问此列而不是外部数据集时当然不起作用。
最好在外部创建对象,因为它是固定的
v1 <- lookup %>%
select(starts_with("pred")) %>%
names() %>%
length()
然后,我们可以简化它
...
coding = case_when(pred_QC4A_code_10 == 0 | pred_QC4A_code_10 == 1 ~ "ABC",
sum_0.95 > 0 & ((sum_0.95 + sum_le_0.5) == (v1))) ~ "DEF",
TRUE ~ "XYZ"))
OP提到数据集中有一个名为“ lookup”的列。因此,如果我们需要使用全局环境中的对象而不是列,请转义(!!
)
new <- old %>%
left_join(., lookup, by = "id") %>%
mutate(sum_0.95 = apply(across(starts_with("pred")), 1, function(x) {sum(x >= 0.95 & x < 1)}),
sum_le_0.5 = apply(across(starts_with("pred")), 1, function(x) {sum(x <= 0.5 & x > 0)}),
coding = case_when(pred_QC4A_code_10 == 0 | pred_QC4A_code_10 == 1 ~ "ABC",
sum_0.95 > 0 & (sum_0.95 + sum_le_0.5 == (!!lookup %>% select(starts_with("pred")) %>% names() %>% length())) ~ "DEF",
TRUE ~ "XYZ")) %>%
select(-starts_with("pred"), -sum_0.95, -sum_le_0.5)
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句