我在R中创建了一个函数列表。列表中的函数与独立编写的函数的行为方式不同

时间:2014-04-29 17:23:31

标签: r list function

以下数据是更大数据集的简化版本。

我有三个数据框的列表,名为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]]给出正确输出的建议;也就是说,函数输出相同。 一个更好的方法来实现我想要的输出也是受欢迎的。

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])