在R语言中通过列位置在dplyr::mutate中使用ifelse的方法
当然可以做到!在dplyr::mutate()调用里,哪怕不知道第一列的列名,我们也有好几种方式通过位置来引用它,实现你要的ifelse逻辑。下面是几种实用的方法:
方法1:用.引用当前数据框,结合[[1]]
在管道操作中,.代表当前传递进来的数据框,[[1]]就会提取它的第一列,直接用在ifelse里就行:
library(dplyr, warn.conflicts = FALSE) set.seed(123) # 固定随机数,让结果可复现 tibble(x = 1:10, y = rnorm(10)) %>% mutate(z = ifelse(.[[1]] < 4, "a", "b"))
运行结果:
#> # A tibble: 10 x 3 #> x y z #> <int> <dbl> <chr> #> 1 1 -0.560 a #> 2 2 -0.230 a #> 3 3 1.56 a #> 4 4 0.0705 b #> 5 5 0.129 b #> 6 6 1.72 b #> 7 7 0.461 b #> 8 8 -1.27 b #> 9 9 -0.687 b #>10 10 -0.446 b
方法2:用pull()函数提取指定位置的列
pull()是dplyr里专门用来提取单列的函数,传入位置参数1就能拿到第一列,用法同样简洁:
tibble(x = 1:10, y = rnorm(10)) %>% mutate(z = ifelse(pull(1) < 4, "a", "b"))
方法3:用cur_data()更安全地引用当前数据(适合分组场景)
如果你的操作涉及分组(比如用group_by()之后),cur_data()会只引用当前分组的数据,避免意外引用整个数据框,搭配[[1]]就很稳妥:
tibble(x = 1:10, y = rnorm(10)) %>% mutate(z = ifelse(cur_data()[[1]] < 4, "a", "b"))
这几种方法都能完美替代你原来用列名的写法,完全不需要知道第一列叫什么,直接靠位置就能实现逻辑。
内容的提问来源于stack exchange,提问作者FMM
相关产品推荐
相关产品推荐

