【问题标题】:Apply custom function to grouped or selected columns将自定义函数应用于分组或选定的列
【发布时间】:2022-11-08 00:33:00
【问题描述】:

我想重新编码我的数据框中的某些项目,那些包含偶数(N2、N4、N6、E2 等)的项目 对于这些选定列的每个值,我想应用abs(x-6)(请参阅我的函数)。然后我需要另外 2 列,其中包含同一类别的项目的平均值:每行的均值(N)和均值(E)。

示例代码: df1 <- tibble(id = 1:5, N1 = c(4,3,2,5,4), N2 = c(1,1,3,2,5), N3 = c(5,5,2,4,3), N4 = c(4,2,2,2,1), N5 = c(1,1,4,2,3), N6 = c(5,2,4,3,1),E1 = c(1,2,3,1,1), E2 = c(5,2,3,1,1), E3 = c(2,2,1,3,1), E4 = c(1,1,1,3,2), E5 = c(2,3,1,4,4), E6 = c(3,2,3,3,1))

我的功能:

recode_items <- function(reverse_items) {
  items <- abs(reverse_items - 6)
  return(items)
}

我的代码:

recoded_df1 <- df1 |>
  group_by(ends_with(c("2","4","6"))) |>
  group_modify(~ recode_items(.x)) |>
  ungroup() |>
  mutate(id = id,
         N = mean(N1:N6),
         E = mean(E1:E6))

我的代码不起作用,我收到此行的错误消息:group_by(ends_with(c("2","4","6")))。我尝试了许多变体,包括 filter()、select()、select_at() 等。

谢谢你的帮助!

【问题讨论】:

    标签: r


    【解决方案1】:

    我们可能需要用across 包装。此外,ends_with 只能有一个输入,不能有多个。关于mean 部分,它可以是rowMeans

    df1 %>% 
       group_by(across(matches("(2|4|6)$")))  %>% 
       group_modify(~ recode_items(.x)) %>% 
       ungroup %>%  
       mutate(N =  rowMeans(across(N1:N6)), 
              E = rowMeans(across(E1:E6)))
    

    【讨论】:

    • 我收到此错误消息...警告:数值表达式有 5 个元素:仅使用第一个元素
    猜你喜欢
    • 1970-01-01
    • 2018-03-03
    • 1970-01-01
    • 1970-01-01
    • 2017-01-28
    • 2018-01-04
    • 1970-01-01
    • 2020-10-28
    • 2021-09-14
    相关资源
    最近更新 更多