試圖基於匹配的另一個數據幀DF2,其中DF1比DF2更大的創造數據幀DF1列:匹配數據幀列:一個int和另一個是列表
df1$val2 <- df2$val2[match(df1$id, df2$IDs)]
這完全不是那麼回事因爲DF2 $標識列的列表:
> df2
IDs val2
1 0 1
2 1, 2 2
3 3, 4 3
4 5, 6 4
5 7, 8 5
6 9, 10 6
7 11, 12, 13, 14 7
它僅適用於在列表中有1元的部分(第1行:.. $:以上INT 0)。對於所有其他行,'匹配(df1 $ id,df2 $ IDs)'返回NA。
匹配一些個體數量的測試工作得很好用雙括號:
2 %in% df2[[2,'IDs']]
所以,我要麼需要修改列DF2 $ ID或需要以不同的方式進行匹配操作。 df1有許多其他列,df2也是如此,但df2在行中要短得多。
的情況下,可以用下面的被複制:
IDs <- c("[0]", "[1, 2]", "[3, 4]", "[5, 6]", "[7, 8]", "[9, 10]", "[11, 12, 13, 14]")
val2 <- c(1,2,3,4,5,6,7)
df2 <- data.frame(IDs, val2)
df2$IDs <- lapply(strsplit(as.character(df2$IDs), ','), function (x) as.integer(gsub("\\s|\\[|\\]", "", x)))
id <- floor(runif(100, min=0, max=15))
df1 <- data.frame(id)
str(df1)
str(df2)
df1$val2 <- df2$val2[match(df1$id, df2$IDs)]
一可重複的例子可以來得心應手...你有沒有嘗試unlist(df2 $ ID)? – Cris
@Cris。謝謝。這將產生一個平面列表,但我們需要保持每行適當的列表。例如,在第2行中,我們列出了:int 1 2.這告訴我們所有具有值1和2的ID映射到該行。 – Dimon
您正在討論一個示例,但這不同於構建和提供*可重現*示例。請參閱https://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example/28481250#28481250 – Frank