【发布时间】:2020-06-20 13:35:43
【问题描述】:
一个 data.frame df1 被查询(模糊匹配)与另一个 data.frame df2 和 agrep。通过迭代其输出(一个名为matches 的列表在df2 中保存相应匹配的行号),df1 填充有来自df2 的关联值。
目标是传递给mapply的函数;但是,在我所有的尝试中,df1 保持不变。
在 for 循环中,代码按预期工作,并使用来自 df2 的附属变量填充 df1。不过,我很想知道如何使用传递给mapply 的函数来解决这个问题。
首先是两个data.frames:
df1 <- structure(list(Species = c("Alisma plantago-aquatica", "Alnus glutinosa",
"Carex davalliana", "Carex echinata",
"Carex elata"),
CheckPoint = c(NA, NA, NA, NA, NA),
L = c(NA, NA, NA, NA, NA),
R = c(NA, NA, NA, NA, NA),
K = c(NA, NA, NA, NA, NA)),
row.names = c(NA, 5L), class = "data.frame")
df2 <- structure(list(Species = c("Alisma gramineum", "Alisma lanceolatum",
"Alisma plantago-aquatica", "Alnus glutinosa",
"Alnus incana", "Alnus viridis",
"Carex davalliana", "Carex depauperata",
"Carex diandra", "Carex digitata",
"Carex dioica", "Carex distans",
"Carex disticha", "Carex echinata",
"Carex elata"),
L = c(7L, 7L, 7L, 5L, 6L, 7L, 9L, 4L, 8L, 3L, 9L, 9L, 8L,
8L, 8L),
R = c(7L, 7L, 5L, 5L, 4L, 3L, 4L, 7L, 6L, NA, 4L, 6L, 6L,
NA, NA),
K = c(6L, 2L, NA, 3L, 5L, 4L, 4L, 2L, 7L, 4L, NA, 3L, NA,
3L, 2L)),
row.names = seq(1:15), class = "data.frame")
然后,通过Species进行模糊匹配:
matches <- lapply(df1$Species, agrep, x = df2$Species, value = FALSE,
max.distance = c(deletions = 0,
insertions = 1,
substitutions = 1))
使用来自df2 的值填充df1 可以按预期工作:
for (i in 1:dim(df1)[1]){
df1[i, 2:5] <- df2[matches[[i]], ]
}
与我使用mapply 的方法相反,它确实返回了正确的值,尽管作为一个从未写入df1 的反汇编值列表。没有任何组合(有或没有return(df1),将其写入另一个变量,也没有尝试SIMPLIFY 或USE.NAMES 的状态)产生了预期的结果。
populatedf1 <- function(matches, index){
df1[index, 2:5] <- df2[matches, ]
#return(df1)
}
mapply(populatedf1, matches, seq_along(matches), SIMPLIFY = FALSE,
USE.NAMES = FALSE)
如果有人知道解决方案或可以为我指明某个方向,那就太好了,谢谢! :)
【问题讨论】: