代码之家  ›  专栏  ›  技术社区  ›  Filipe C

获取R中数据帧的ID,并将描述列中的文本粘贴到具有匹配ID的所有行中

  •  2
  • Filipe C  · 技术社区  · 10 年前

    我在R中有一个数据帧,它有3列:ID(可能重复)、代码和描述。我需要创建一个代码段,该代码段使用该数据帧返回一个具有相同行数的数据帧,其中每行有一个ID、一个代码以及原始DF中与该ID相关联的所有描述(无论是在不同的列中,还是在具有粘贴文本的单个列中,都可以);

    例如,我有以下数据帧df:

    IDstest <- c(1:5,5:1,3,4,1)
    codestest <- c("X1","Z1","C1","X1","X2","J9","A","Y1","Z2","C5","A","P2","Z")
    descriptiontest <- c("Desc 1","Desc 2","Test","Just typing randomly","Desc 4","Desc 5","Desc 1","Random","Desc ZZZ","Desc 1","YYY","XYZ","Desc 4","Test")
    
    df <- data.frame(IDstest, codestest, descriptiontest)
    df
    
        IDstest codestest      descriptiontest
    1        1        X1               Desc 1
    2        2        Z1               Desc 2
    3        3        C1                 Test
    4        4        X1 Just typing randomly
    5        5        X2               Desc 4
    6        5        J9               Desc 5
    7        4         A               Desc 1
    8        3        Y1               Random
    9        2        Z2             Desc ZZZ
    10       1        C5               Desc 1
    11       3         A                  YYY
    12       4        P2                  XYZ
    13       1         Z               Desc 4
    

    我希望收到类似于以下内容的邮件:

         IDstest codestest                 descriptiontest
    1        1        X1            Desc 1; Desc 1; Desc 4
    2        2        Z1                  Desc 2; Desc ZZZ
    3        3        C1                 Test; Random; YYY
    4        4        X1 Just typing randomly; Desc 1; XYZ
    5        5        X2                    Desc 4; Desc 5
    6        5        J9                    Desc 5; Desc 4
    7        4         A  Desc 1;Just typing randomly; XYZ
    8        3        Y1                 Random; Test; YYY
    9        2        Z2                 Desc ZZZ; Desc 2 
    10       1        C5            Desc 1; Desc 1; Desc 4
    11       3         A                 YYY; Test; Random
    12       4        P2 XYZ; Just typing randomly; Desc 1
    13       1         Z            Desc 4; Desc 1; Desc 1
    

    如前所述,来自其他行的匹配文本不必在“descriptiontest”列中,添加列就可以了。

    你能帮助我吗?

    1 回复  |  直到 10 年前
        1
  •  1
  •   Ron Jensen    10 年前

    这是一种快速而肮脏的方法。我相信其他人会提出一个非常简单的单行方法。:)

    IDstest <- c(1:5,5:1,3,4,1)
    codestest <- c("X1","Z1","C1","X1","X2","J9","A","Y1","Z2","C5","A","P2","Z")
    descriptiontest <- c("Desc 1","Desc 2","Test","Just typing randomly","Desc 4","Desc 5","Desc 1","Random","Desc ZZZ","Desc 1","YYY","XYZ","Desc 4")
    
    df <- data.frame(IDstest, codestest, descriptiontest)
    
    uniqueIDs <- unique(df[,"IDstest"])
    mergedescription <- rep("", length(uniqueIDs))
    for(i in uniqueIDs ) {
      mergedescription[i] <- paste(df[IDstest == i, "descriptiontest"], collapse = "; ")
    }
    
    mdf <- data.frame(IDstest = uniqueIDs, mergedescription)
    
    final.df <- merge(df, mdf)
    

    这将按IDstest对记录进行排序,作为一种副作用:

       IDstest codestest      descriptiontest                  mergedescription
    1        1        X1               Desc 1            Desc 1; Desc 1; Desc 4
    2        1        C5               Desc 1            Desc 1; Desc 1; Desc 4
    3        1         Z               Desc 4            Desc 1; Desc 1; Desc 4
    4        2        Z1               Desc 2                  Desc 2; Desc ZZZ
    5        2        Z2             Desc ZZZ                  Desc 2; Desc ZZZ
    6        3        C1                 Test                 Test; Random; YYY
    7        3        Y1               Random                 Test; Random; YYY
    8        3         A                  YYY                 Test; Random; YYY
    9        4        X1 Just typing randomly Just typing randomly; Desc 1; XYZ
    10       4         A               Desc 1 Just typing randomly; Desc 1; XYZ
    11       4        P2                  XYZ Just typing randomly; Desc 1; XYZ
    12       5        J9               Desc 5                    Desc 4; Desc 5
    13       5        X2               Desc 4                    Desc 4; Desc 5