如何解决错误:R函数中使用lapply的“参数1必须具有名称”
我正在尝试使用通用函数来计算2个长度不同的数据集中的行之间的差异。我的第一个函数仅占用我们指定的一行并进行计算,但是我有兴趣应用此函数,但在数据集或矩阵中的所有行上,我都尝试了lapply
,但遇到了错误{{1} },并查看了此答案Problem with bind_rows: Error: Argument 1 must have names,但不明白。任何帮助将不胜感激
Error: Argument 1 must have names
第二个函数的预期输出应该是,例如,如果我将阈值设置为# datasets
d1 = data.frame(V1=1:5,V3=6:10)
d2 = data.frame(V1=c(2,3,4,5),V2=c(6,6,5,9))
d1
V1 V3
1 1 6
2 2 7
3 3 8
4 4 9
5 5 10
d2
V1 V2
1 2 6
2 3 6
3 4 5
4 5 9
# the first function
soustraction.i=function(databig,datasmall,i,threshold){
databig=as.data.frame(databig)
datasmall=as.data.frame(datasmall)
dif=map2_df(databig,datasmall[i,],`-`)
dif[dif<0] = 0
dif$mismatch=rowSums(dif)
dif=dif[which(dif$mismatch <= threshold),]
return(dif)
}
# If i am interested the first row in d2 with all rows in d1 i get the right answer
soustraction.i(d1,d2,1,3)
# A tibble: 3 x 3
V1 V3 mismatch
<dbl> <dbl> <dbl>
1 0 0 0
2 0 1 1
3 1 2 3
# However,i do not know how to do the same calculation but over all the rows in d2 (the small dataset)
# d2 is always smaller than d1
# Here is what i tried
#The seconf function
soustraction.matrice=function(d1,threshold){
d1=as.matrix(d1)
d2=as.matrix(d2)
n=nrow(d2)
diff.mat=lapply(1:n,soustraction.i,d1,d2)
diff.mat=as.data.frame(diff.mat)
return(diff.mat)
}
soustraction.matrice(d1,3)
#Error: Argument 1 must have names.
(我不确定第二个函数中的阈值是否应该重新定义)
3
解决方法
您可以使用map_df
并将功能应用于d2
中的每一行。
purrr::map_df(1:nrow(d2),~soustraction.i(d1,d2,.x,3))
# A tibble: 14 x 3
# V1 V3 mismatch
# <dbl> <dbl> <dbl>
# 1 0 0 0
# 2 0 1 1
# 3 1 2 3
# 4 0 0 0
# 5 0 1 1
# 6 0 2 2
# 7 0 1 1
# 8 0 2 2
# 9 0 3 3
#10 0 0 0
#11 0 0 0
#12 0 0 0
#13 0 0 0
#14 0 1 1
类似地,您可以使用lapply
进行操作:
do.call(rbind,lapply(1:nrow(d2),function(x) soustraction.i(d1,x,3)))
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。