Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/80.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 具有多列数据的两个列表的条件匹配。帧_R_List_Dataframe - Fatal编程技术网

R 具有多列数据的两个列表的条件匹配。帧

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

我有一个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=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