我在R中创建了一个函数列表。列表中的函数与独立编写的函数的行为方式不同
下面的数据是一个更大数据集的简化版本 我有以下三个数据帧的列表,名为df.list:我在R中创建了一个函数列表。列表中的函数与独立编写的函数的行为方式不同,r,list,function,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
> 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)
当我将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]]和function.1给出了不同的输出,和/或关于如何生成function.list[[1]]给出了正确的输出;也就是说,输出与函数1相同?
也欢迎使用更好的代码来实现所需的输出。我认为这可以做到:
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])
仔细看看mapply如何循环以及它返回什么。
> 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"
> mapply(function.list[[1]], df.primary$e, df.primary$f,df.primary$g)
[1] "no" "no" "no" "no"
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])