我正在尝试使用通用函数来计算长度不同的2个数据集中的行之间的差异。我的第一个函数只接受我们指定的一行并进行计算,但是我有兴趣应用此函数,但是在我的数据集或矩阵中的所有行上,我尝试了lapply
,但出现错误 Error: Argument 1 must have names
并查看了此答案Problem with bind_rows: 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,d2,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,d2,3)
#Error: Argument 1 must have names.
第二个函数的预期输出应该是,例如,如果我将阈值设置为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
最佳答案
您可以使用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,d2,x,3)))
关于r - 错误: “Argument 1 must have names” using lapply within a function in R,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/64546531/