【问题标题】:R: populate data.frame within function in mapplyR:在mapply的函数内填充data.frame
【发布时间】:2020-06-20 13:35:43
【问题描述】:

一个 data.frame df1 被查询(模糊匹配)与另一个 data.frame df2agrep。通过迭代其输出(一个名为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),将其写入另一个变量,也没有尝试SIMPLIFYUSE.NAMES 的状态)产生了预期的结果。

populatedf1 <- function(matches, index){
    df1[index, 2:5] <- df2[matches, ]
  #return(df1)
  }

mapply(populatedf1, matches, seq_along(matches), SIMPLIFY = FALSE,
              USE.NAMES = FALSE)

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

【问题讨论】:

    标签: r dataframe mapply


    【解决方案1】:

    实际上,如果您将lapply 替换为sapply(这样它返回一个向量而不是列表),然后执行直接赋值,则此处不需要任何循环(formapply)。

    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
    

    就您的方法而言,您可以将MapmapplySIMPLIFY = FALSE 一起使用,并使用do.callrbind 将数据帧列表放入一个数据帧中,然后进行分配。

    df1[, 2:5] <- do.call(rbind, Map(populatedf1, matches, seq_along(matches)))
    

    【讨论】:

    • 酷,他们两个都能胜任!还有这么及时的回复,谢谢! :)
    猜你喜欢
    • 2015-10-28
    • 1970-01-01
    • 2017-11-01
    • 2015-06-04
    • 2020-10-22
    • 1970-01-01
    • 2020-02-08
    • 2017-08-09
    • 2020-01-13
    相关资源
    最近更新 更多