将函数应用于 tibble 中的每个值(并返回一个 tibble)



这里的用法很简单,但大多数关于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)

最新更新