2016-07-04 108 views
-1

我在這裏找到了兩個帖子,其中有一些我的問題的部分解決方案。首先是here,第二個是here按行長度添加不同長度的列

我有一點點不同的情況。我有一個不同長度的數據框的列表,我想將它加入到關於行名的一個數據框中。如果某行的名稱不在數據框中,則該列應該具有NaN的值。

例如,我有接下來的三個數據幀:

mylist[1] - > DF1:

num 
a 1 
b 1 

mylist[2] - > DF2:

num 
a 1 
b 2 
c 3 
d 1 

mylist[3] - > DF3:

num 
c 1 
d 1 

我要的是得到下一個數據幀:

num1 num2 num3 
a 1  1  NaN 
b 1  2  NaN 
c NaN 3  1 
d NaN 1  1 

這意味着,在NaN值都在正確的地方,而不是在列的底部,像在第一個例子。所有DataFrame的長度都不同,並且與第二個示例中的不同。

+0

一些,這是一個有點難以遵循,所以用樣本數據重複的例子,我們可以複製粘貼/於R會有幫助。 –

+0

@ zx8754,非常感謝,它的工作原理。我真的不知道合併函數添加一個新的列,我雖然它增加了新的行到現有的DF。非常感謝你 – Guforu

回答

2

我會做的兩個步驟:

1)添加包含rownames一個id列:

mylist <- lapply(mylist, function(x) transform(x, id = row.names(x))) 

2)由ID列合併所有data.frame的:

Reduce(function(...) merge(..., by = "id", all=TRUE), mylist) 
# id num.x num.y num 
#1 a  1  1 NA 
#2 b  1  2 NA 
#3 c NA  3 1 
#4 d NA  1 1 

如果您在mylist中有許多項目,則無需手動鍵入每個merge命令,這種方法將非常有用。

1

您可以使用merge來執行此操作。

matrix(c("a","b",3,4),2,2) 
df1 <- data.frame(label=c("a","b"),num1=c(1,1)) 
df2 <- data.frame(label=c("a","b","c","d"),num2=c(1,2,3,1)) 
df3 <- data.frame(label=c("c","d"),num3=c(1,1)) 

result <- merge(merge(df1,df2,by="label",all=TRUE),df3,by="label",all=TRUE) 

> result 
    label num1 num2 num3 
1  a 1 1 NA 
2  b 1 2 NA 
3  c NA 3 1 
4  d NA 1 1 
2

我們可以通過與所有row.names合併= TRUE:

# dummy data 
df1 <- read.table(text = " 
    num 
a 1 
b 1") 

df2 <- read.table(text = " 
    num 
a 1 
b 2 
c 3 
d 1") 

df3 <- read.table(text = " 
    num 
c 1 
d 1") 


merge(
    merge(df1, df2, by = "row.names", all = TRUE), 
    df3, by.x = "Row.names", by.y = "row.names", all = TRUE) 

#output 
# Row.names num.x num.y num 
# 1   a  1  1 NA 
# 2   b  1  2 NA 
# 3   c NA  3 1 
# 4   d NA  1 1