r - 使用 dplyr 将函数应用于 data.frame 中的一行

标签 r dplyr tidyverse purrr

在基地 R我会做以下事情:

d <- data.frame(a = 1:4, b = 4:1, c = 2:5)
apply(d, 1, which.max)
dplyr我可以执行以下操作:
library(dplyr)
d %>% mutate(u = purrr::pmap_int(list(a, b, c), function(...) which.max(c(...))))
如果 d 中还有另一列我需要指定它,但我希望它可以使用任意数量的列。
从概念上讲,我想要类似的东西
pmap_int(list(everything()), ...)
pmap_int(list(.), ...)
但这显然行不通。我将如何用 dplyr 规范地解决这个问题?

最佳答案

我们只需要将数据指定为 .data.framelist以列作为列表元素。如果我们包装 list(.) ,它变成了一个嵌套列表

library(dplyr)
d %>% 
  mutate(u = pmap_int(., ~ which.max(c(...))))
#  a b c u
#1 1 4 2 2
#2 2 3 3 2
#3 3 2 4 3
#4 4 1 5 3

或者可以使用cur_data()
d %>%
   mutate(u = pmap_int(cur_data(), ~ which.max(c(...))))

或者如果我们想使用 everything() , 把它放在里面 selectlist(everything())没有解决应该从中选择所有内容的数据
d %>% 
   mutate(u = pmap_int(select(., everything()), ~ which.max(c(...))))

或使用 rowwise
d %>%
    rowwise %>% 
    mutate(u = which.max(cur_data())) %>%
    ungroup
# A tibble: 4 x 4
#      a     b     c     u
#  <int> <int> <int> <int>
#1     1     4     2     2
#2     2     3     3     2
#3     3     2     4     3
#4     4     1     5     3

或者使用 max.col 更有效
max.col(d, 'first')
#[1] 2 2 3 3
或与 collapse
library(collapse)
dapply(d, which.max, MARGIN = 1)
#[1] 2 2 3 3
可以包含在 dplyr 中作为
d %>% 
    mutate(u = max.col(cur_data(), 'first'))

关于r - 使用 dplyr 将函数应用于 data.frame 中的一行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66935005/

相关文章:

r - Dygraph 的 %>% 替换了 Dplyr 的

r - 除了names_from和values_from之外,pivot_wider是否还需要任何其他信息

r - websocket 连接不起作用

r - 以累积方式在数据帧列表中建立一个值

r - 如果存在,则从多列中填充新列

r - 创建循环图

r - 对每个列组合应用函数

r - 在 R 中,如何将数据帧的某些行与某些逻辑相加?

r - 在 R 中查找上一行的最后一个字符

r - 由强制引起的 NA _ 平均值和 SD _ 百分比