2017-08-11 52 views
2

我想將數據框的特定列聚合成列表並連接行。感謝您的幫助。例如:根據空列將數據框列聚合成列表

df <-data.frame(id=c(12,NA,NA,15,NA),name=c("John",NA,NA,"Jane",NA),grades=c(88,65,94,73,77)) 
> df 
    id name grades 
1 12 John  88 
2 NA <NA>  65 
3 NA <NA>  94 
4 15 Jane  73 
5 NA <NA>  77 

我需要產生的數據幀到看起來像這樣:使用na.locf從「動物園」包

df1 <- data.frame(id=c(12,15),name=c("John","Jane")) 
df1$grades <- list(c(88,65,94),c(73,77)) 
> df1 
    id name  grades 
1 12 John 88, 65, 94 
2 15 Jane  73, 77 
+0

看看「動物園」的'no.locf'功能開始.... – A5C1D2H2I1M1N2O1R2T1

回答

3

填充在NA值,則使用聚合的首選方法。例如,下面是一個使用aggregate功能的方法在基礎R:

library(zoo) 
aggregate(grades ~ id + name, na.locf(df), c) 
# id name  grades 
# 1 15 Jane  73, 77 
# 2 12 John 88, 65, 94 
str(.Last.value) 
# 'data.frame': 2 obs. of 3 variables: 
# $ id : chr "15" "12" 
# $ name : chr "Jane" "John" 
# $ grades:List of 2 
# ..$ 1.2: chr "73" "77" 
# ..$ 2.1: chr "88" "65" "94" 
+0

看起來不錯!我的實際數據框有〜100列。任何想法如何避免爲聚合部分寫「成績〜id +名字+ ... x100 .. +」? – Eric

+0

@Eric,try:'aggregate(grades〜。,na.locf(df),c)' – A5C1D2H2I1M1N2O1R2T1

-1

使用na.locf功能

library(zoo) 
    df<-na.locf(df, option="locf", na.remaining="mean") 

然後聚集通過名稱或ID

+0

看''zoo :: na.locf',我看不到任何參數,'option ='和'na.remaining ='。你應該顯示你正在使用哪個函數庫。 – Frank

+1

啊,忘記了這個論點是來自包(padr)的,一定會確保我今後有這個。謝謝! – Chabo

+0

其實@Frank,參數(na.remaining),來自包(動物園)。我的錯。 – Chabo

0

您還可以使用data.talezoo包(假設grades被第三列):

library(data.table) 
setDT(zoo::na.locf(df))[,.(grades= list(grades)), by=names(df[,-3])] 

# id name  grades 
# 1: 12 John 88, 65, 94 
# 2: 15 Jane  73, 77