如何使用Lapply对来自单独列表的dfs进行数据集列表的子集

时间:2019-06-28 05:26:14

标签: r list subset lapply

Im从2个列表(list_a和list_b)开始,每个列表都包含df类。我的目标是创建一个包含新df的新列表。新的df将包含list_a [[1]]中所有与list_b [[1]]中的行匹配的行,依此类推。我能够成功地手动应用代码,但是在尝试使用lapply时遇到错误消息。

可重现的示例:2个列表,每个列表包含df类的2个元素

此示例要使用的df_a列表

df_a1 <- data.frame(X = c(17,17,18,18), Y=c(105,106,108,109), 
Z=c(3,4,4,6))
df_a2 <- data.frame(X = c(17,17,18,18), Y=c(105,106,108,109), 
Z=c(5,5,4,5))
list_a <- list(df_a1,df_a2)
df_a_list_names<-c("control", "variable")
names(list_a)<-gsub("\\.swc$", "",df_a_list_names)

df_b1 <- data.frame(X= c(17,17,17,18), Y = c(105,106,107,105), 
Z=c(3,4,6,7), I=c(50,50,50,50))
df_b2 <- data.frame(X = c(17,17,17,17), Y = c(105,106,107,108), 
Z=c(5,5,6,7), I=c(75,75,75,75))
list_b <- list(df_b1,df_b2)
df_b_list_names<-c("control", "variable")
names(list_b)<-gsub("\\.txt$", "",df_b_list_names)

手动应用时有效的代码

list_a[[1]]->fobA  
list_b[[1]]->fobB

new.df<-fobB%>%semi_join(fobA,by="X")%>%
semi_join(fobA,by="Y")%>%
semi_join(fobA,by="Z")
arrange(new.df, Z)->final.df

没有手动运行的手动运行结果

data.frame':2个观察点。共有4个变量:

$ X:num 17 17

$ Y:num 105 106

$ Z:数字3 4

$ I:数字50 50

在上面进行了功能修改

fxn3<-function(x){
new.df<-list_b%>%semi_join(list_a,by="X")%>%
semi_join(list_a,by="Y")%>%
semi_join(list_a,by="Z")
arrange(new.df, Z)->final.df
return(final.df)
}

在这里,我尝试将lapply与自定义功能一起使用

lapply(list_a, "fxn3")->fob.final.listHere is the error message 

我收到以下错误消息

UseMethod(“ semi_join”)中的错误:没有适用的方法

semi_join应用于“列表”类的对象

3 个答案:

答案 0 :(得分:3)

您不必执行semi_join()三次,只需一步就可以做到:

library(tidyverse)
map2(.x = list_b, .y = list_a, ~  semi_join(.x, .y, by=c("X", "Y", "Z")))

答案 1 :(得分:1)

在这里,我们需要对每个list中相应的数据集进行联接,因此我们可以使用map2

library(tidyverse)
map2(list_b, list_a, semi_join)
#$control
#   X   Y Z  I
#1 17 105 3 50
#2 17 106 4 50

#$variable
#   X   Y Z  I
#1 17 105 5 75
#2 17 106 5 75

注意:在这里,我们首先显示了map2选项


base R中,我们可以使用Map

Map(merge, list_b, list_a)

答案 2 :(得分:0)

OP请求的lapply解决方案如下所示。

lapply(1:2, function(x) merge(list_b[[x]], list_a[[x]]))
# [[1]]
#    X   Y Z  I
# 1 17 105 3 50
# 2 17 106 4 50
# 
# [[2]]
#    X   Y Z  I
# 1 17 105 5 75
# 2 17 106 5 75