【问题标题】:How to use mapply to apply a function to two different columns in two different data frames如何使用 mapply 将函数应用于两个不同数据框中的两个不同列
【发布时间】:2015-02-20 04:35:40
【问题描述】:

我正在尝试在两个不同数据帧的两列之间查找重复项。在识别出重复项后,我想从重复项所在的同一行但从不同的列中提取观察值,并将其插入到另一个数据框中。我举个例子:

Table1:
tobecopied   B   Checkfordup   D
Copy1        2   dupchk1       5
Copy2        3   dupchk5       4
Copy3        4   dupchk4       K

Table2:
tobepastedinto   B   Checkfordup   D
                 5   dupchk1       L
                 6   dupchk2       M
                 7   dupchk4       3

所以代码运行后,表二会是这样的:

Updated Table2:

tobepastedinto   B   Checkfordup   D
Copy1            5   dupchk1       L
                 6   dupchk2       M
Copy3            7   dupchk4       3

我尝试做的是创建一个函数来执行此操作并在两列中使用 mapply。下面是代码的样子:

             checknum <- function(x,y){
               if(y=x){
                 gsub(x,y,Table2$tobepastedinto)
               }
               else{""}
             }
            mapply(checknum,Table2$Checkfordup,Table1$Checkfordup)

该函数在 R 中运行需要很长时间,我很确定我做错了。有没有人对我正在尝试做的事情有更好的解决方案?或者有没有更好的方法来使用mapply?

编辑: 这是小数据集。 NASET 里面没有数字。我想看看 Numberset 中是否有任何手机与 NASET 中的手机匹配,然后将相应的 Number 添加到 NASET,即使名称不匹配:

 NASET:
 name     Number     mobile
 VAN                 678
 GEORGE              6564
 STEVEN              76787



Numberset:
 name     Number     mobile
 TEU      7          678
 GEGE     6          64
 VEN      5          87
 TETK     7          678

Updated NASET:
NASET:
 name     Number     mobile
 VAN      7          678
 GEORGE              6564
 STEVEN              76787

【问题讨论】:

    标签: r function mapply


    【解决方案1】:

    你可以试试

    df2$tobepasteinto <- df1$tobecopied[match(df2$Checkfordup, df1$Checkfordup)]
    df2$tobepasteinto[is.na(df2$tobepasteinto)] <- ''
    

    或者

    df2$tobepasteinto <-  mapply(function(x,y,z) {indx <- match(x,y)
                              ifelse(is.na(indx), '', z[indx])},
                   df2$Checkfordup, list(df1$Checkfordup),list(df1$tobecopied))
    

    更新

      NASET$Number <- Numberset$Number[match(NASET$mobile, Numberset$mobile)]
      NASET$Number[is.na(NASET$Number)] <- ''
      NASET
      #    name Number mobile
      #1    VAN      7    678
      #2 GEORGE          6564
      #3 STEVEN         76787
    

    或者

      NASET$Number <- mapply(function(x,y,z) {
                         indx <- match(x,y)
                       ifelse(is.na(indx), '', z[indx])},
                 NASET$mobile, list(Numberset$mobile), list(Numberset$Number))
    

    或者

      library(dplyr)
      left_join(NASET[,-2], unique(Numberset[2:3]), by='mobile')
      #   mobile   name Number
      #1    678    VAN      7
      #2   6564 GEORGE     NA
      #3  76787 STEVEN     NA
    

    数据

    df1 <-  structure(list(tobecopied = c("Copy1", "Copy2", "Copy3"), B = 2:4, 
    Checkfordup = c("dupchk1", "dupchk5", "dupchk4"), D = c("5", 
    "4", "K")), .Names = c("tobecopied", "B", "Checkfordup", 
    "D"), class = "data.frame", row.names = c(NA, -3L))
    
     df2 <-  structure(list(tobepastedinto = c("", "", "", ""), B = 5:8,
      Checkfordup = c("dupchk1", "dupchk2", "dupchk4", "dupchk4"), 
      D = c("L", "M", "3", "5")), .Names = c("tobepastedinto", 
     "B", "Checkfordup", "D"), row.names = c(NA, -4L), class = "data.frame")
    

    新数据

      NASET <- structure(list(name = c("VAN", "GEORGE", "STEVEN"), Number = c(NA, 
      NA, NA), mobile = c(678L, 6564L, 76787L)), .Names = c("name", 
      "Number", "mobile"), class = "data.frame", row.names = c(NA, -3L))
    
     Numberset <- structure(list(name = c("TEU", "GEGE", "VEN", "TETK"),
     Number = c(7L, 6L, 5L, 7L), mobile = c(678L, 64L, 87L, 678L)), .Names =
      c("name", "Number", "mobile"), class = "data.frame", row.names = c(NA, 
     -4L))
    

    【讨论】:

    • 你好,数据帧长度不同怎么办?因此,它给了我一个错误。
    • df1 vs df2不同长度的错误依然存在。我认为 mapply 会检查 df1 中的每一行与 df2 中的所有行,所以我不知道为什么长度很重要
    • 第一段代码错误依然存在
    • 存储在 indx 中的值是 TRUE 或 FALSE,而不是行的索引。这是它应该返回的吗?
    • 抱歉问题正在发生,因为 df2 的行数比 df1 少得多。 df1 有 800000 行,而 df2 有 400000 行。所以当索引试图在 df2 中替换时,我得到的错误是 df2 中的行数不足
    猜你喜欢
    • 2021-06-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-22
    • 1970-01-01
    • 1970-01-01
    • 2021-11-02
    • 2017-01-21
    相关资源
    最近更新 更多