使用'mutate_'按行排列一堆列

Aru*_*run 11 r dplyr

在这篇博文中,Paul Hiemstra展示了如何总结两列dplyr::mutate_.复制/粘贴相关部件:

library(lazyeval)
f = function(col1, col2, new_col_name) {
    mutate_call = lazyeval::interp(~ a + b, a = as.name(col1), b = as.name(col2))
    mtcars %>% mutate_(.dots = setNames(list(mutate_call), new_col_name))
}
Run Code Online (Sandbox Code Playgroud)

允许一个人做:

head(f('wt', 'mpg', 'hahaaa'))
Run Code Online (Sandbox Code Playgroud)

大!

我跟着一个问题(见评论)关于如何将它扩展到100列,因为我不太清楚(对我而言)如何使用上述方法键入所有名称.保罗非常友好地放纵我并提供了这个答案(谢谢!):

# data
df = data.frame(matrix(1:100, 10, 10))
names(df) = LETTERS[1:10]

# answer
sum_all_rows = function(list_of_cols) {
  summarise_calls = sapply(list_of_cols, function(col) {
    lazyeval::interp(~col_name, col_name = as.name(col))
  })
  df %>% select_(.dots = summarise_calls) %>% mutate(ans1 = rowSums(.))
}
sum_all_rows(LETTERS[sample(1:10, 5)])
Run Code Online (Sandbox Code Playgroud)

我想在这些方面改进这个答案:

  1. 其他栏目已经消失.我想保留它们.

  2. 它使用rowSums()必须将data.frame强制转换为我想避免的矩阵.

    另外,我不知道,如果使用.do()动词鼓励?因为.在使用时内部mutate()似乎不适应那些行group_by().

  3. 最重要的是,我怎样才能使用mutate_()而不是mutate()

我找到了这个答案,它解决了第1点,但不幸的是,这两个dplyr答案rowSums()一起使用mutate().


PS:我刚刚在那个答案下阅读了哈德利的评论.国际自然保护联盟,'重塑到长形+群组+总和+重塑到广泛形式'是dplyr这类运作的推荐方式吗?

tal*_*lat 7

这是一种不同的方法:

library(dplyr); library(lazyeval)
f <- function(df, list_of_cols, new_col) {
  df %>% 
    mutate_(.dots = ~Reduce(`+`, .[list_of_cols])) %>% 
    setNames(c(names(df), new_col))
}

head(f(mtcars, c("mpg", "cyl"), "x"))
#   mpg cyl disp  hp drat    wt  qsec vs am gear carb    x
#1 21.0   6  160 110 3.90 2.620 16.46  0  1    4    4 27.0
#2 21.0   6  160 110 3.90 2.875 17.02  0  1    4    4 27.0
#3 22.8   4  108  93 3.85 2.320 18.61  1  1    4    1 26.8
#4 21.4   6  258 110 3.08 3.215 19.44  1  0    3    1 27.4
#5 18.7   8  360 175 3.15 3.440 17.02  0  0    3    2 26.7
#6 18.1   6  225 105 2.76 3.460 20.22  1  0    3    1 24.1
Run Code Online (Sandbox Code Playgroud)

关于你的观点:

  • 保留其他列
  • 它不使用 rowSums
  • 你特意要求在这里进行逐行操作,所以我不确定(还)group_by在使用.内部时如何可以造成任何伤害mutate/mutate_
  • 它利用了 mutate_