R 具有多列数据的两个列表的条件匹配。帧
我有一个data.frames列表,每个data.frames中有多个列。每个data.frame具有相同的结构。 此外,我还有一个包含多个data.frames的列表 假设这是两个列表:R 具有多列数据的两个列表的条件匹配。帧,r,list,dataframe,R,List,Dataframe,我有一个data.frames列表,每个data.frames中有多个列。每个data.frame具有相同的结构。 此外,我还有一个包含多个data.frames的列表 假设这是两个列表: firstlist <- list(a=data.frame(AA=5:1, BB=1:5), b=data.frame(AA=5:1, BB=1:5), c=da
firstlist <- list(a=data.frame(AA=5:1,
BB=1:5),
b=data.frame(AA=5:1,
BB=1:5),
c=data.frame(AA=5:1,
BB=1:5))
secondlist <- list(a=data.frame(AA=1:10,
BB=c(0,0,1,0,0,1,1,0,0,0)),
b=data.frame(AA=1:10,
BB=c(0,1,0,0,0,0,1,0,0,0)),
c=data.frame(AA=1:10,
BB=c(1,0,0,0,0,1,1,0,0,0)))
我需要使用For循环还是有其他方法
更新:
有关boolen数据和所有数据类型,请参阅
提前谢谢你
lapply(seq_along(firstlist),
function(i) {
d.1 = merge(firstlist[[i]], secondlist[[i]], by = "AA", sort = FALSE)
names(d.1) = c("AA", "BB", "CC")
d.2 = suppressWarnings(merge(firstlist[[i]], secondlist[[i]], by.x = "BB", by.y = "AA", sort = FALSE))
names(d.2) = c("BB", "AA", "CC")
d.1$CC = 0 + (d.1$CC | d.2$CC)
d.1
})
您可能希望重命名上面的列,而不是取消警告。下面是另一个相对较短的方法(假设
secondlist
中的BB
是二进制的(只有0和另一个值):
lapply(seq_______________________________{
tt如果CC是真正的布尔值
f <- function(a,b) cbind( a, CC=b$BB[ match( a$AA, b$AA ) ] |
b$BB[ match( a$BB, b$AA ) ] )
mapply( f, firstlist, secondlist, SIMPLIFY=F )
您能告诉我们您的数据的预期结果吗?第一部分对我来说有点不清楚…”我需要检查firstlist中AA或BB中的行@Arun我已编辑了问题。添加了预期结果。换句话说,我需要检查每个data.frame of firstlist中AA列或BB列中的任何行是否包含与secondlist相同命名data.frame中AA列中的行相同的值。如果是,我需要用secondlist中BB的相应值填充firstlist中的新列CC。I虽然听起来比较复杂,但我不知道如何更好地描述它。$b列CC
0,1,0,1,0
?您能解释一下吗?我在注释中的代码处有问题。这是因为在第二个列表$b中,列BB在2和7处为1。在第一个列表中,第2行BB和第4行AA中有一个2。CC是真的吗/FALSE或者这只是示例中的一个例子?我认为比这个更复杂,因为您没有为第一个列表中与BB列匹配的人复制条目。是的,此代码没有考虑BB form firstlist。它也没有保留data.frames和columns的名称。但这可能是一个很好的开始方式。@eddi Awesome!它我将尝试将其应用于实际数据,并在完成后立即报告。@eddi您的代码运行得很好,但我无法将其应用于实际数据。这就是我接受另一个答案的原因。谢谢!因为它是二进制的,所以工作得很好。只有一个装饰性的问题:有没有办法保存“firstlist”的“names”?我可以还原它们,因为它们也存储在一个额外的向量中,但最好保留它们。您可以使用setNames()将lappy
包装起来,例如:out
lapply(seq_along(firstlist), function(ix) {
tt <- secondlist[[ix]][secondlist[[ix]]$BB != 0, ]
transform(firstlist[[ix]], CC = 1 * (firstlist[[ix]]$AA %in% tt$AA |
firstlist[[ix]]$BB %in% tt$AA))
})
f <- function(a,b) cbind( a, CC=b$BB[ match( a$AA, b$AA ) ] |
b$BB[ match( a$BB, b$AA ) ] )
mapply( f, firstlist, secondlist, SIMPLIFY=F )
Unit: milliseconds
expr min lq median uq max neval
this mapply 1.726471 1.840671 1.870504 1.939473 13.88875 100
Arun's lapply 2.930061 3.048110 3.134402 3.209786 14.61630 100