R:在mapply中的函数内填充data.frame

R:在mapply中的函数内填充data.frame,r,dataframe,mapply,R,Dataframe,Mapply,使用agrep查询data.frame df1与另一data.frame df2的模糊匹配。通过在其输出上迭代一个名为matches的列表,该列表保存了df2中各个匹配项的行号,df1由来自df2的关联值填充。 目标是传递给mapply的函数;然而,在我所有的尝试中,df1保持不变 在for循环中,代码按预期工作,并使用来自df2的附属变量填充df1。尽管如此,我还是对如何使用传递给mapply的函数来解决这个问题感兴趣 首先,两个data.frames: df1 <- structure

使用agrep查询data.frame df1与另一data.frame df2的模糊匹配。通过在其输出上迭代一个名为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")
使用df2中的值填充df1的效果与预期一样:

for (i in 1:dim(df1)[1]){
  df1[i, 2:5] <- df2[matches[[i]], ]
  }

如果有人知道解决方案或能为我指明方向,那就太好了,谢谢!:

实际上,如果将lappy替换为sapply,使其返回向量而不是列表,然后执行直接赋值,则不需要在此处为或mapply执行任何循环

matches <- sapply(df1$Species, agrep, x = df2$Species, value = FALSE,
                   max.distance = c(deletions = 0,
                                    insertions = 1,
                                   substitutions = 1))

df1[, 2:5] <- df2[matches,]
df1

#                   Species               CheckPoint L  R  K
#1 Alisma plantago-aquatica Alisma plantago-aquatica 7  5 NA
#2          Alnus glutinosa          Alnus glutinosa 5  5  3
#3         Carex davalliana         Carex davalliana 9  4  4
#4           Carex echinata           Carex echinata 8 NA  3
#5              Carex elata              Carex elata 8 NA  2

实际上,如果将lappy替换为sapply,使其返回一个向量而不是列表,然后执行直接赋值,则不需要为或mapply执行任何循环

matches <- sapply(df1$Species, agrep, x = df2$Species, value = FALSE,
                   max.distance = c(deletions = 0,
                                    insertions = 1,
                                   substitutions = 1))

df1[, 2:5] <- df2[matches,]
df1

#                   Species               CheckPoint L  R  K
#1 Alisma plantago-aquatica Alisma plantago-aquatica 7  5 NA
#2          Alnus glutinosa          Alnus glutinosa 5  5  3
#3         Carex davalliana         Carex davalliana 9  4  4
#4           Carex echinata           Carex echinata 8 NA  3
#5              Carex elata              Carex elata 8 NA  2

酷,他们两个都做了!如此迅速的回应,谢谢!:酷,他们两个都做了!如此迅速的回应,谢谢!:
matches <- sapply(df1$Species, agrep, x = df2$Species, value = FALSE,
                   max.distance = c(deletions = 0,
                                    insertions = 1,
                                   substitutions = 1))

df1[, 2:5] <- df2[matches,]
df1

#                   Species               CheckPoint L  R  K
#1 Alisma plantago-aquatica Alisma plantago-aquatica 7  5 NA
#2          Alnus glutinosa          Alnus glutinosa 5  5  3
#3         Carex davalliana         Carex davalliana 9  4  4
#4           Carex echinata           Carex echinata 8 NA  3
#5              Carex elata              Carex elata 8 NA  2
df1[, 2:5] <- do.call(rbind, Map(populatedf1, matches, seq_along(matches)))