簡體   English   中英

dplyr - 使用列索引而不是列名將列輸入到 rowwise()

[英]dplyr - inputting columns to rowwise() with column index instead of column name

我找到了一個很好的解決方案,我想在這里創建一個新列來計算相應行中所有單元格的平均值:

https://stackoverflow.com/a/33438918/12744116

無可否認,數據並不整潔,但我在下面復制的解決方案可以完成工作:

data %>% 
    rowwise() %>% 
    mutate(c=mean(c(a,b)))

#      id     a     b     c
#   (dbl) (dbl) (dbl) (dbl)
# 1   101     1     2   1.5
# 2   102     2     2   2.0
# 3   103     3     2   2.5

但是,與這個更簡單的示例不同,我要命名的列太多了。 我想知道是否有任何方法可以使用切片符號快速引用列(即,而不是 c(a, b),類似於 2:3)或通過索引引用列的其他方式。

我在此處的另一個 Stack Overflow 線程上發現了類似的內容,但該解決方案有其自身的問題,因為我們列出了所有列索引而不是列名。 我的列太多了,無法為每個計算列出所有列。

任何解決方案?

編輯:我自己想出了一個,但我覺得它太不雅了,我相信我可能會為每一行提取整列,這顯然比預期的解決方案要慢:

data %>%
  mutate(id = row_number()) %>%
  rowwise() %>%
  mutate(avg = mean(c(.[id, 2:4], recursive=TRUE)))

任何更快的解決方案?

你可以做:

df %>%
 mutate(c = rowMeans(select(., 2:3)))

   id a b   c
1 101 1 2 1.5
2 102 2 2 2.0
3 103 3 2 2.5

或者:

df %>%
 mutate(c = rowMeans(select(., 2:length(.))))

對我來說,使用rowMeans似乎很簡單,不涉及tidyverse函數。

data$c <- rowMeans(data[2:3])

但是,如果您更喜歡tidyverse解決方案,我們可以從purrr map函數中獲得一些幫助。

library(dplyr)
library(purrr)

僅用於兩列

data %>% mutate(c = map2_dbl(a, b, ~mean(c(.x, .y))))

對於多列

data %>%  mutate(c = pmap_dbl(select(., a:b), ~mean(c(...))))

暫無
暫無

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

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