2015-05-27 35 views
1

嗨我的數據框看起來像這樣。最右邊的列是我想要的列。R:來自多個向量的並行第二大值

Name Fund-A Fund-B Fund-C SecondLargest(Desired) 
    John 30000 20000 10000  20000 
    Tom  NA  40000 15000  15000 
    Sarah 5000  NA  NA  NA 
    Kate NA  NA  NA  NA 

我只想基金-A中的第二大值,基金-B和基金C.如果沒有第二大的,我可以用NA,空白或零活。我知道「pmax」會給我最高的平行值。我不知道如何獲得第二高的價值。只是幫助。您的幫助真誠地感謝!

+1

重塑長格式將是另一種選擇,也可能是對大數據集慢。 '庫(dplyr);庫(tidyr); bind_cols(df1,add_rownames(df1,var ='rn')%>%gather(Var,Val,matches('Fund'))%>%group_by(rn)%>%arrange(desc(Val))%>% slice(2L)%>%ungroup()%>%select(Val))' – akrun

回答

2

這裏的另一種選擇:

R> apply(tbl[,2:4], 1, function(x) x[rank(1/x) == 2]) 
#[1] 20000 15000 NA NA 

然後可以正常地分配給你的對象,例如如@ akrun的回答。


tbl <- read.table(
    text = " Name Fund-A Fund-B Fund-C SecondLargest(Desired) 
    John 30000 20000 10000  20000 
    Tom  NA  40000 15000  15000 
    Sarah 5000  NA  NA  NA 
    Kate NA  NA  NA  NA", 
    header=TRUE, 
    stringsAsFactors=FALSE) 
+1

'1/x'是創新的 – akrun

+1

@akrun謝謝!我花了幾分鐘的時間才意識到'rank'是按*升序順序排列的東西...... – nrussell

+0

@akrun非常感謝。你能否好好教育我1/x在這裏做什麼?我對R很新。謝謝。 – gibbz00

2

嘗試

df1$SecondLargest <- apply(df1[-1], 1, function(x) c(x[is.na(x)], sort(x))[2]) 
相關問題