2016-03-31 118 views
1

我有一個數據幀稱爲df看起來像這樣在計算列時,如何使用dplyr對列進行求和?

GENDER,CHOCOLATE,VANILLA,...A_BUNCH_OF_COLUMNS_HERE...,ORANGUTAN 
M,11,22,...,33 
F,22,33,...,44 
M,22,11,...,22 
F,44,55,...,66 

我想打一個新列名爲PERCENTAGE_ORANGUTAN這將被計算爲ORANGUTAN/SUM(previous_columns)

我知道如何使計算列與dplyr如果我知道ORANGUTAN之前的列的名稱。但如果我不知道ORANGUTAN之前的名稱或列數,我該如何計算PERCENTAGE_ORANGUTAN?或者沒有dplyr

回答

4

可能會有更多的「dplyr-ish」成語,但如果您知道需要ORANGUTAN列之前的所有列,則可以使用match來選擇它們。例如,使用內置的mtcars數據幀:

mtcars %>% 
    mutate(pct = wt/rowSums(.[ , 1:(match("wt", names(.))-1)])) 

上面的代碼由所有列的總和除以wt柱它前面(這是無意義的,只是創建一個名爲pct新列爲了說明)。

.是指代表mtcars數據幀的「代名詞」。

我們希望第1列到第wt之前的列的總和。 match返回列名爲mtcars的向量中的wt的數字索引。該值正好是6,所以我們減去1從中通過5

0

在基地得到1列的總和:

首先,我們將刪除非數值的所有列:

df1 <- df[,sapply(df, is.numeric)] 

df$new <- df1$ORANGUTAN/rowSums(df1[ , 1:which(names(df1) == 'ORANGUTAN')]) 

給出:

然後,通過那些具有一個指數大於 '猩猩' 更大,並且子集分

[1] 0.5000000 0.4444444 0.4000000 0.4000000 

數據:

df = read.table(text = "GENDER,CHOCOLATE,VANILLA,ORANGUTAN 
M,11,22,33 
F,22,33,44 
M,22,11,22 
F,44,55,66", sep = ',', header = TRUE)