2017-04-07 30 views
2

比方說,我有一個DF包含ID,性別,和幾個數值變量,MAX1,MAX2和MAX3,其中總和基於變量R中的名字

MAX1 =第一的變量名X1,X2,X3,X4,X5

MAX2的最大值= X1,X2,X3,X4的第二最大值的變量名,X5

MAX3 =第三最大值的變量名x1,x2,x3,x4,x5

### Generate data 
set.seed(123) 
    ID <- c(1,2,3,4,5,6,7,8,9,10) 
gender <- c("m", "m", "m", "f", "f", "m", "m", "f", "f", "m") 
x1 <- rnorm(10, 0, 1) 
x2 <- rnorm(10, 0, 1) 
x3 <- rnorm(10, 0, 1) 
x4 <- rnorm(10, 0, 1) 
x5 <- rnorm(10, 0, 1) 
df <- data.frame(ID, gender, x1, x2, x3, x4, x5) 

maxes <- t(sapply(1:nrow(df), function(i) { 
    names(sort(df[i,3:7], decreasing=T)[1:3]) 
})) 
colnames(maxes) <- c("MAX1","MAX2", "MAX3") 
df <- cbind(df, maxes) 

現在我需要創建一個新的列(調用ir m_sum),它的總和值爲MAX1和MAX2。

例如,對於ID = 1,MAX1 = x2和MAX2 = x4,則m_sum等於1.2240818 + 0.42646422 = 1.650546。

+0

是否有理由通過先確定MAXi行名稱然後嘗試使用行名稱來總結每行的兩個最高值?我寧願轉置你的數據,並總結前兩個值,但也許你已經簡化了你的例子,以便我的方法打破其他要求... –

+0

是的,我知道這不是最有效的....但後來我需要使用MAX1和MAX2 ... – user9292

回答

3

如何使用apply在一次調用中完成所有操作?

df$m_sum <- apply(df, 1, function(x) as.double(x[x[ "MAX1" ]]) + as.double(x[x[ "MAX2" ]])) 
#[1] 1.65054602 0.15189652 2.45383397 3.04708946 2.02954308 3.50197809 1.39170465 0.09146139 1.2 
#[10] 1.17044583 
+0

優雅的代碼!只是爲了讓其他讀者能夠清楚地重複使用這個答案:解決方案循環遍歷所有'data.frame'行(參數'margin'爲'1'),這在行數很多的情況下非常緩慢(但是性能沒有OP的要求,所以這裏絕對沒問題)。 –

+0

謝謝。我選擇這個答案是因爲它比別人快。 – user9292

0

這是通過df$MAX1等因素,使用

,但一個簡單的循環像

sumMAX1MAX2 <- numeric() 
for (r in 1:nrow(df)){ 
    sumMAX1MAX2[r] <- df[r, as.character(df$MAX1)[r]] + 
         df[r, as.character(df$MAX2)[r]] 
    } 

複雜,似乎產生

> sumMAX1MAX2 
[1] 1.65054602 0.15189655 2.45383398 3.04708945 2.02954308 3.50197812 
[7] 1.39170470 0.09146141 1.2 1.17044585 

另一種方式是做同樣的事情到您的maxes,如

altsumMAX1MAX2 <- sapply(1:nrow(df), function(i){ 
    sum(sort(df[i,3:7], decreasing=T)[1:2]) 
    })