2015-01-26 79 views
4

我有一種新的含有得到的不同時間點測得的多個變量的數據幀在所選擇的列的含義(例如,test1_tp1test1_tp2test1_tp3test2_tp1test2_tp2,...)。與行添加逐列使用dplyr

我現在試圖使用dplyr向數據框中添加一個新列,以計算這些列的選擇(例如,所有時間點上的平均值爲test1)上的行平均值。

  1. 即使用明確命名的列來計算平均值的語法,我仍然掙扎着。我嘗試沒有成功是:

data %>% ... %>% mutate(test1_mean = mean(test1_tp1, test1_tp2, test1_tp3, na.rm = TRUE)

  • 我願進一步使用正則表達式/通配符選擇列名,所以像
  • data %>% ... %>% mutate(test1_mean = mean(matches("test1_.*"), na.rm = TRUE)

    +1

    使用'橫行()'如答案爲[該SO問題](http://stackoverflow.com/questions/21818181/applying-a-function-to-every-row-of-描述一個表 - 使用-dplyr)。 – eipi10 2015-01-26 21:43:13

    +0

    謝謝大家的好評!所有這些都是非常有用的...由於我沒有足夠的聲譽,我不能滿足你的答案,但只能選擇一個作爲解決方案,對不起! – user21932 2015-01-27 00:34:06

    +1

    我強烈建議學習[tidy data](http://vita.had.co.nz/papers/tidy-data.html)。如果你的數據是一個整齊的格式,你會發現這種操作__much__更容易做 – hadley 2015-01-27 01:04:51

    回答

    5

    您可以使用starts_withselect中查找以某個字符串開頭的所有列。

    data %>% 
        mutate(test1 = select(., starts_with("test1_")) %>% 
          rowMeans(na.rm = TRUE)) 
    
    +0

    你可以用'rowwise'和'mean'來代替rowMeans嗎? – beginneR 2017-12-12 12:39:23

    0

    不是dplyr的解決方案,但你可以嘗試:

    cols_2sum <- grepl('test1',colnames(data)) 
    rowMeans(data[,cols_2sum]) 
    
    3

    這裏是你如何能做到這一點的dplyr - 我用的是虹膜數據爲例:

    iris %>% mutate(sum.Sepal = rowSums(.[grep("^Sepal", names(.))])) 
    

    此計算以「萼片」開始所有列的橫行款項。您可以使用rowMeans而不是rowSums