簡體   English   中英

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

[英]Using 'mutate_' to sum a bunch of columns row-wise

在這篇博文中 ,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))
}

允許一個人做:

head(f('wt', 'mpg', 'hahaaa'))

大!

我跟着一個問題(見評論)關於如何將它擴展到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)])

我想在這些方面改進這個答案:

  1. 其他欄目已經消失。 我想保留它們。

  2. 它使用rowSums() ,它必須將data.frame強制轉換為我想避免的矩陣

    另外我不確定是否使用. do()動詞中鼓勵嗎? 因為. 當與group_by()一起使用時, mutate()內部似乎不適應那些行。

  3. 最重要的是,我如何使用mutate_()而不是mutate()來做同樣的mutate_()

我找到了這個答案 ,它解決了第1點,但不幸的是,兩個dplyr答案都使用rowSums()mutate()


PS:我剛剛在那個答案下閱讀了Hadley的評論 IIUC,'以+和+重塑寬形式重塑長表格+集團是建議dplyr方式為這些類型的操作?

這是一種不同的方法:

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

關於你的觀點:

  • 保留其他列
  • 它不使用rowSums
  • 你特意要求在這里進行逐行操作,所以我不確定(還) group_by在使用時如何造成任何傷害. 里面mutate / mutate_
  • 它利用mutate_

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM