在R中,具有以下两个数据帧:
df1 <- structure(list(id = 1:8, value = c(100L, 100L, 100L, 100L, 100L,
100L, 100L, 100L)), class = "data.frame", row.names = c(NA, -8L))
df2 <- structure(list(randomColumnName = c(100L, 2L, 3L, 40L, 5L, 6L, 73L, 8L), OtherRandomColumn = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L), .Label = "'test'", class = "factor"), value = c(100L, 100L, 100L, 100L, 100L, 100L, 100L, 100L)), class = "data.frame", row.names = c(NA, -8L))
print(df1)
id value
1 1 100
2 2 100
3 3 100
4 4 100
5 5 100
6 6 100
7 7 100
8 8 100
print(df2)
randomColumnName OtherRandomColumn value
1 100 'test' 100
2 2 'test' 100
3 3 'test' 100
4 40 'test' 100
5 5 'test' 100
6 6 'test' 100
7 73 'test' 100
8 8 'test' 100
数据帧1具有一个唯一的id列,称为“ id”。我知道df2也有一个包含一些但不是全部 ID的列。预先,我不知道数据框2中相应列的列名。
问题:
是否有任何方便的函数或机制来检查df2中每列的前几个条目(例如50),将它们与df的id列进行比较,并返回最可能与ID匹配的df2列名专栏?
在这种情况下,应该返回“ randomColumnName”列是最有可能与df1的ID列匹配的列。
答案 0 :(得分:2)
您可以尝试循环df2并对照df1$id
检查每一列。总和最大的列是您要合并的列。请注意,该输出是命名向量,因此您可以使用名称或其索引。
i1 <- which.max(sapply(df2, function(i) sum(df1$id == i)))
names(i1)
#[1] "randomColumnName"
i1
#randomColumnName
# 1
答案 1 :(得分:2)
您可以使用data.table执行以下操作。它输出一个data.table(hitmat),该表描述df2每列中与df1中的ID相匹配的条目的分数。如您所见,randomColumnName相对于df1 $ id具有5/8(62.5%)的“匹配”分数。
该代码在实践中的作用是计算df2中每一列的唯一值与df1 $ id的匹配数。请注意,此解决方案假定df2中的适当匹配项是唯一的,正如您所说的,它们在df1中。如果正确的匹配项可能在df2中出现几次,只需在lapply语句中删除unique()。
df1 = data.table(df1)
df2 = data.table(df2)
ids = df1$id # Get IDS
cols = colnames(df2) # Source appropriate subset for df2
hitmat = df2[, lapply(.SD, function(x) sum(unique(x) %in% ids)/length(x)), .SDcols = cols]
> hitmat
randomColumnName OtherRandomColumn value
1: 0.625 0 0