Im从2个列表(list_a和list_b)开始,每个列表都包含df类。我的目标是创建一个包含新df的新列表。新的df将包含list_a [[1]]中所有与list_b [[1]]中的行匹配的行,依此类推。我能够成功地手动应用代码,但是在尝试使用lapply时遇到错误消息。
此示例要使用的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应用于“列表”类的对象
答案 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