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是有意义的。太棒了!非常感谢你!