【问题标题】:Is there a way to use `dplyr` select helper functions in mutate?有没有办法在变异中使用`dplyr`选择辅助函数?
【发布时间】:2017-02-03 01:52:00
【问题描述】:

例如,我有一个数据框,我想在其中获取以“Q3”开头的所有列的总和,我可以输入每一列,但能够执行以下操作会很棒:

#Example data
test <- structure(list(UserID = c("53017366", "53017366"), Q3_1 = c(3L, 
3L), Q3_2 = c(2L, 2L), Q3_3 = c(3L, 3L), Q3_4 = c(NA, 5L)), class = "data.frame", row.names = c(NA, -2L), .Names = c("UserID", "Q3_1", "Q3_2", "Q3_3", "Q3_4"))

#what I'd like to see, but doesn't work
test %>% mutate(total = sum(starts_with("Q3"), na.rm = TRUE))

#What I'd like to end up with:
    UserID Q3_1 Q3_2 Q3_3 Q3_4 total
1 53017366    3    2    3   NA     8
2 53017366    3    2    3    5    13

建议的一个选项herehere 需要在数据中放置一个全新的选择列并使用逐行函数(如 rowSums)。

【问题讨论】:

    标签: r dplyr


    【解决方案1】:

    我们可以使用rowSums

    test %>% 
         mutate(total = rowSums(.[grep("Q3", names(.))], na.rm =TRUE))
    #    UserID Q3_1 Q3_2 Q3_3 Q3_4 total
    #1 53017366    3    2    3   NA     8
    #2 53017366    3    2    3    5    13
    

    【讨论】:

    • 这样的东西,源自您的回答,也有效。谢谢:test %&gt;% mutate(total = rowSums(.[starts_with("Q3", vars = names(.))], na.rm = TRUE))
    • 在这种情况下,我正在考虑总体分数和一些子量表(尽管我不确定我会使用什么)。我可以在选择中添加[1:3] 以轻松地对事物进行子集化。这似乎是一种非常简单的方法,但如果有更好的方法,我会有兴趣学习。
    【解决方案2】:

    对于这种情况,您可以使用janitor::add_totals_col:

    library(janitor)
    test %>%
      add_totals_col()
    #>     UserID Q3_1 Q3_2 Q3_3 Q3_4 Total
    #> 1 53017366    3    2    3   NA     8
    #> 2 53017366    3    2    3    5    13
    

    对于您在此处需要在 mutate 中使用 select 助手的更深层次的问题,这种需求可能表明潜在地缺乏 tidy data 结构。在这种情况下,您在列标题中有值。在更长的整洁格式中,比如使用变量quarter,您可以使用group_bysummarise 优雅地做到这一点。

    【讨论】:

    • 不知道那个功能。感谢提供
    • 感谢您的建议。这是调查数据的一小部分,因此列是不同的问题。它继续使用 Q3_5,依此类推,但最终达到 Q4_1、Q4_2、... 拥有这样的长数据集对我来说是不直观的,但我想它可能包括问题集的列和问题集的列是,然后是价值。
    猜你喜欢
    • 1970-01-01
    • 2016-09-07
    • 2023-01-10
    • 1970-01-01
    • 2021-09-06
    • 2013-03-02
    • 2022-07-07
    • 2010-10-30
    • 2020-02-28
    相关资源
    最近更新 更多