这里的用法很简单,但大多数关于apply/plyr/dplyr的文档都在解释更复杂的操作。
我想从this_tbl
创建一个新的 tibble
> this_tbl
# A tibble: 3 x 2
x y
<dbl> <dbl>
1 42 999
2 0 0
3 1 0
这样,每个值> 0 都变成 1,每个值 <= 0 都变成 0。
> as_tibble(apply(this_tbl,2,function(x){ifelse(x>0, 1, 0)}))
# A tibble: 3 x 2
x y
<dbl> <dbl>
1 1 1
2 0 0
3 1 0
这很好用,但是有没有更优雅的方法可以做到这一点?
来自@Jack Brookes 解决方案的dplyr::mutate_all
现在被across
副词取代,即使在这个简单示例中不需要其他功能:
this_tbl %>% mutate(across(, function(x) ifelse(x > 0, 1, 0)))
dplyr::mutate_all
将函数应用于数据帧中的所有列并返回结果。
this_tbl %>%
mutate_all(function(x){ifelse(x>0, 1, 0)})
从技术上讲,这不会将函数应用于"每个值",而是应用于整个列,这要快得多。如果存在逐值执行的情况,则可以制作函数的矢量化版本。
greater_than_zero <- Vectorized(function(x){
ifelse(x > 0, 1, 0)
})
this_tbl %>%
mutate_all(greater_than_zero)