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

时间:2018-04-12 13:50:35

标签: apply 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

这样每个值&gt; 0变为1,并且每个值&lt; = 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

这样做很好,但有更优雅的方法吗?

2 个答案:

答案 0 :(得分:1)

现在,@ Jack Brookes解决方案中的

dplyr::mutate_all已被across副词所取代,尽管在此简单示例中不需要其他功能:

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

答案 1 :(得分:0)

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)

从技术上讲,这并不是将函数应用于“每个值”,而是作为一个整体应用于每个列,这要快得多。如果您希望逐个值地执行此操作,则可以制作该函数的矢量化版本。

{{1}}