将函数应用于小标题中的每个值(和 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)))
这里的用法很简单,但是大多数关于 apply/plyr/dplyr 的文档都在解释更复杂的操作。
我想从 this_tbl
> 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)
dplyr::mutate_all
现在被 across
副词取代,即使在这个简单的例子中不需要额外的功能:
this_tbl %>% mutate(across(, function(x) ifelse(x > 0, 1, 0)))