2012-08-01 108 views
2

我有一個問題,我想道歉,如果這個問題已經被討論過了,儘管我檢查了舊帖子。R在列中組合不同長度的數據幀。

我有一個data.frame有2列,第二列可以包含幾個標識符,但數字可以有所不同。在另一個數據幀中,標識符對應於另一個標識符。

df.1 

color identifier 
blue A1, B2, C3, C4 
yellow B2, C4, C6 
green A3 

df.2 

A1 Mercedes 
A3 BMW 
B2 Porsche 
C3 Toyota 
C4 Hundai 
C5 Volkswagen 
C6 Peugeot  

我想什麼有是這樣的data.frame:

df.3 

color identifier  identifier2 
blue A1, B2, C3, C4 Mercedes, Porsche, Toyota, Hundai 
yellow B2, C4, C6  Porsche, Hundai, Peugeot 
green A3    BMW 

其中包含標識符和另外第二data.frame的標識符的data.frame。

我正在嘗試使用apply和stack和unstack,但我根本沒有成功。

你有什麼建議嗎?

回答

2

這是另一種解決方案,使用strsplit

# The data 
df.1 = read.table(header=TRUE, text=" 
color identifier 
blue 'A1, B2, C3, C4' 
yellow 'B2, C4, C6' 
green 'A3'", stringsAsFactors = FALSE) 

df.2 = read.table(header=FALSE, text=" 
A1 Mercedes 
A3 BMW 
B2 Porsche 
C3 Toyota 
C4 Hundai 
C5 Volkswagen 
C6 Peugeot", stringsAsFactors=FALSE) 
names(df.2) = c("identifier", "car") 

df.1$identifier = strsplit(df.1$identifier, split=", ") 
df.1$identifier1 = lapply(1:nrow(df.1), 
     function(x) df.2[which(df.2$identifier %in% df.1$identifier[[x]]), 2]) 
df.1 
# color  identifier      identifier1 
# 1 blue A1, B2, C3, C4 Mercedes, Porsche, Toyota, Hundai 
# 2 yellow  B2, C4, C6   Porsche, Hundai, Peugeot 
# 3 green    A3        BMW 

注意identifieridentifier1現在在你的data.frame名單。我個人覺得這件事稍後會更容易。

str(df.1) 
# 'data.frame': 3 obs. of 3 variables: 
# $ color  : chr "blue" "yellow" "green" 
# $ identifier :List of 3 
# ..$ : chr "A1" "B2" "C3" "C4" 
# ..$ : chr "B2" "C4" "C6" 
# ..$ : chr "A3" 
# $ identifier1:List of 3 
# ..$ : chr "Mercedes" "Porsche" "Toyota" "Hundai" 
# ..$ : chr "Porsche" "Hundai" "Peugeot" 
# ..$ : chr "BMW" 

您可能需要修改strsplit是否有遺留下來的任何空白,但這個樣本數據的工作。另外,爲使strsplit正常工作,數據需要處於as.character模式(因此在讀取數據時我使用stringsAsFactors)。

更新:write.table()

寧願保持數據的情況下,我希望做進一步的分析列表。但是,如果資料齊全或者只是爲了輸出的目的,你可能想要做這樣的事情:

df.3 = df.1 
df.3$identifier = sapply(df.3$identifier, paste0, collapse=", ") 
df.3$identifier1 = sapply(df.3$identifier1, paste0, collapse=", ") 

這將允許您使用write.table因爲identifieridentifier1現在的模式character,而不是list

+0

謝謝mrdwab,這個解決方案對我來說非常合適。 – 2012-08-01 11:47:07

+0

但是,處理data.frame中的列表真的更容易嗎?例如。如果我嘗試寫入表格,則會收到錯誤消息。 – 2012-08-01 13:41:09

+0

@ R.newbie,看我的更新。 – A5C1D2H2I1M1N2O1R2T1 2012-08-02 02:37:43

1

可能最簡單的方法是使用正則表達式與gsub進行替換。

重建數據:

df1 <- read.table(text=" 
color identifier 
blue 'A1, B2, C3, C4' 
yellow 'B2, C4, C6' 
green A3 
", header=TRUE) 


df2 <- read.table(text=" 
A1 Mercedes 
A3 BMW 
B2 Porsche 
C3 Toyota 
C4 Hundai 
C5 Volkswagen 
C6 Peugeot 
", header=FALSE) 

而現在,你必須通過你的顏色查找(df2)中的每個元素循環,並在df1更換:

for (i in seq_len(nrow(df2))){ 
    df1$identifier <- gsub(df2[i, 1], df2[i, 2], df1$identifier) 
} 

結果:

df1 
    color      identifier 
1 blue Mercedes, Porsche, Toyota, Hundai 
2 yellow   Porsche, Hundai, Peugeot 
3 green        BMW 
+0

謝謝Andrie的建議。 – 2012-08-01 11:48:25

相關問題