以下数据是更大数据集的简化版本。
我有三个数据框的列表,名为df.list:
> part.1<-data.frame(c(1,2,3,4), c(5,6,7,8),c(9,10,11,12))
>part.2<-data.frame(c(1,2,3,1),c(5,4,7,1),c(9,4,10,1))
> part.3<-data.frame(c(2,2,3,3),c(2,2,7,7),c(2,2,10,10))
> colnames(part.1)<-c("a","b","c")
> colnames(part.2)<-c("a","b","c")
> colnames(part.3)<-c("a","b","c")
> df.list<-list(part.1,part.2,part.3)
我想看看另一个数据帧中的每个行(名为df.primary)是否与df.list中三个数据帧中的任何行完全匹配,而df.list中的每个数据帧都是单独考虑的。
我想要的最终输出是一个字符向量列表(df.list中每个数据帧的一个向量,对应于df.primary中行数的向量长度)读取“是”或“否”取决于是否存在是df.primary中的完全匹配。我在下面的代码中将列表命名为final.yes.no.list。
我编写了以下代码来执行此操作:
> df.primary<-data.frame(c(1,1,3,3), c(5,5,7,7), c(9,9,10,10))
> a1.list<-alist(x=,y=,z=, c(for (i in 1:4){if(x==as.numeric(df.list[[1]]$a[i]) & y==as.numeric(df.list[[1]]$b[i]) & z==as.numeric(df.list[[1]]$c[i])){a<-"yes"}else{a<-"no"}}, return(a)))
> b1.list<-alist(x=,y=,z=, c(for (i in 1:4){if(x==as.numeric(df.list[[2]]$a[i]) & y==as.numeric(df.list[[2]]$b[i]) & z==as.numeric(df.list[[2]]$c[i])){a<-"yes"}else{a<-"no"}}, return(a)))
> c1.list<-alist(x=,y=,z=, c(for (i in 1:4){if(x==as.numeric(df.list[[3]]$a[i]) & y==as.numeric(df.list[[3]]$b[i]) & z==as.numeric(df.list[[3]]$c[i])){a<-"yes"}else{a<-"no"}}, return(a)))
> combo<-list(a1.list,b1.list,c1.list)
> function.list<-lapply(combo,as.function)
> final.yes.no.list<-list()
> for(j in 1:3)
+ {
+ final.yes.no.list[[j]]<-mapply(function.list[[j]],as.list(df.primary$e), as.list(df.primary$f),as.list(df.primary$g))
+ print(final.yes.no.list[[j]])
+ }
> str(final.yes.no.list)
List of 3
$ : chr [1:4] "no" "no" "no" "no"
$ : chr [1:4] "no" "no" "no" "no"
$ : chr [1:4] "no" "no" "yes" "yes"
输出不是我想要的final.yes.no.list中的第一个和第二个向量,但它适用于列表中的最后一个向量。
它应该是(我修改了下面的输出看起来像我想要的那样):
> str(final.yes.no.list)
List of 3
$ : chr [1:4] "yes" "yes" "no" "no"
$ : chr [1:4] "yes" "yes" "yes" "yes"
$ : chr [1:4] "no" "no" "yes" "yes"
当我将function.list [[1]]作为一个独立的函数(用于评估df.list中的第一个数据帧),命名为function.1时,它给出了所需的输出。
> function.1<-function(x,y,z)
+ {
+ {for (i in 1:4)
+ {
+ if(x==as.numeric(df.list[[1]]$a[i]) & y==as.numeric(df.list[[1]]$b[i]) & z==as.numeric(df.list[[1]]$c[i]))
+ {a<-"yes"}
+ else{a<-"no"}
+ return(a)
+ }
+ }
+ }
> mapply(function.1, df.primary$e, df.primary$f,df.primary$g)
[1] "yes" "yes" "no" "no"
相反,function.list [[1]]给出以下内容:
> mapply(function.list[[1]], df.primary$e, df.primary$f,df.primary$g)
[1] "no" "no" "no" "no"
有没有人解释为什么function.list [[1]]和function.1给出不同的输出,和/或关于如何使function.list [[1]]给出正确输出的建议;也就是说,函数输出相同。 一个更好的方法来实现我想要的输出也是受欢迎的。
答案 0 :(得分:0)
我认为这样做:
check_rows <- function(df.ref, dfs.check){
ref_rows <- apply(X=df.ref, MARGIN=1,
FUN=function(row) paste(row, collapse='-'))
lapply(X=dfs.check, FUN=function(df.check){
df_rows <- apply(X=df.check, MARGIN=1,
FUN=function(row) paste(row, collapse='-'))
ifelse(df_rows %in% ref_rows, 'yes', 'no')
})
}
check_rows(df.ref=df.primary, dfs.check=df.list)
check_rows(df.ref=df.primary, dfs.check=df.list[1])