這是另一種解決方案,使用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
注意identifier
和identifier1
現在在你的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
因爲identifier
和identifier1
現在的模式character
,而不是list
。
謝謝mrdwab,這個解決方案對我來說非常合適。 – 2012-08-01 11:47:07
但是,處理data.frame中的列表真的更容易嗎?例如。如果我嘗試寫入表格,則會收到錯誤消息。 – 2012-08-01 13:41:09
@ R.newbie,看我的更新。 – A5C1D2H2I1M1N2O1R2T1 2012-08-02 02:37:43