这是另一个解决方案,使用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
sinceidentifier
和identifier1
are now of modecharacter
而不是list
.