Dplyr:使用mutate、cross、where和ì;在R中对多个整列进行felse
这是我的代码:Dplyr:使用mutate、cross、where和ì;在R中对多个整列进行felse,r,dplyr,R,Dplyr,这是我的代码: library(vcd) data(Arthritis) df<-as.tibble(Arthritis) df %>% mutate(across(where(~ is.integer(.x) && first(.x) > 50), ~ ifelse(is.integer(.x), .x * 2, .x))) 库(vcd) 数据(关节炎) df%变异(跨越(~is.integer(.x)和&first(.x)>50),~ifelse(is
library(vcd)
data(Arthritis)
df<-as.tibble(Arthritis)
df %>% mutate(across(where(~ is.integer(.x) && first(.x) > 50), ~ ifelse(is.integer(.x), .x * 2, .x)))
库(vcd)
数据(关节炎)
df%变异(跨越(~is.integer(.x)和&first(.x)>50),~ifelse(is.integer(.x),.x*2.x)))
我想将第一行数字大于50且为整数的整列相乘
但为什么它不起作用呢?
可能是因为我使用的是第一个(.x)
首先使用我做错了什么
非常感谢将first()
逻辑移出选择并进入操作,不要复制is.integer
检查:
df %>%
mutate(across(where(is.integer),
~ if(first(.x) > 50) {.x * 2} else{.x})
)
非常感谢。我仍然不明白这为什么不起作用。ìfelse`不应该给我相同的输出?是。整数(1:3)
将返回一个TRUE或FALSE。ifelse()
结果的长度始终与ifelse()
测试参数的长度相同,在本例中长度为1,因为是.integer()
结果的长度为1。(与first
有相同的问题-测试的长度为1,但您想要的结果更长。)因此,我们需要切换到if(){}else{}
,它总是期望测试的长度为1,结果可以是任何内容。可能有一种方法可以使用Cross的选择参数来完成这一切,但对我来说这似乎更自然:“>50”不会对所有列类型都有意义,因此首先获取整数列,然后测试它们的第一个条目是否大于50是有意义的。太棒了!非常感谢你!