将函数应用于小标题中的每个值(和 return 小标题)?

Apply a function to every value in a tibble (and return a 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

这很好用,但是有没有更优雅的方法来做到这一点?

dplyr::mutate_all 将函数应用于数据框中的所有列,并 returns 结果。

this_tbl %>%
 mutate_all(function(x){ifelse(x>0, 1, 0)})

从技术上讲,这不会将函数应用到 "every value",而是将每个列作为一个整体应用,这样速度要快得多。如果在某些情况下你想逐个值地执行它,你可以制作该函数的矢量化版本。

greater_than_zero <- Vectorized(function(x){
    ifelse(x > 0, 1, 0)
})

this_tbl %>%
 mutate_all(greater_than_zero)
来自@Jack Brookes 解决方案的

dplyr::mutate_all 现在被 across 副词取代,即使在这个简单的例子中不需要额外的功能:

this_tbl %>% mutate(across(, function(x) ifelse(x > 0, 1, 0)))