【问题标题】:Combine multiple rows in R based on Column A基于A列在R中组合多行
【发布时间】:2021-04-09 01:09:06
【问题描述】:

我正在总结一个包含 7000 多个非数字值的巨大数据框。

以下是我尝试处理数据的示例。

Person Description Initials Locations
Jake Info1 JK Mars
Jake Info2 JK Jupiter
Sam Info1 SP Saturn
Sam Info2 SP Earth
Sam Info3 SP Mars

我希望我的输出是这样的:

Person Description Initials Locations
Jake Info1 ; Info2 JK Mars ; Jupiter
Sam Info1 ; Info2 ; Info3 SP Saturn ; Earth ; Mars

我已将数据导入 R,但不太确定如何根据第一列合并所有数据。我知道我们可以在 R 中使用聚合的数字。我应该如何仅使用值/非数字信息并将它们与它们之间的分号结合起来。

我将不胜感激这方面的任何帮助。提前谢谢你。

test <- read.table(file='test_data.tsv', sep = '\t', header = TRUE, fill = TRUE)

【问题讨论】:

    标签: r csv text dplyr


    【解决方案1】:

    你可以使用aggregate():

    ~ 右侧的变量是分组变量,而. 代表“测试”数据框中的所有其他变量。然后将其他传递的参数paste()collapse 用于分组数据。

    aggregate(.~Person+Initials, test, paste, collapse=" ; ")
    ##   Person Initials           Description             Locations
    ## 1   Jake       JK         Info1 ; Info2        Mars ; Jupiter
    ## 2    Sam       SP Info1 ; Info2 ; Info3 Saturn ; Earth ; Mars
    

    它产生的结果与其他建议的解决方案相同:

    res_Tjebo <- test %>%
                    group_by(Person, Initials) %>%
                    summarise(Description = paste(Description, collapse = ","),
                              Locations   = paste(Locations,   collapse = ",")) %>% 
                    ungroup()
    
    res_jwarz <- test %>% 
                    aggregate(
                      .~Person+Initials, 
                      ., 
                      paste, collapse=",") %>%
                    as_tibble()
    
    identical(res_Tjebo, res_jwarz)
    ## [1] TRUE
    

    【讨论】:

    • 感谢您的帮助。不幸的是,这种方法会产生粘贴单元格的数字长度,而不是实际的文本信息。
    • 我不明白你的意思,但我很高兴你找到了一个可行的解决方案:)。
    【解决方案2】:

    您可以使用汇总、粘贴和折叠:

    test <- read.table(
    text = "Person  Description Initials    Locations
    Jake    Info1   JK  Mars
    Jake    Info2   JK  Jupiter
    Sam Info1   SP  Saturn
    Sam Info2   SP  Earth
    Sam Info3   SP  Mars", sep = '\t', header = TRUE, fill = TRUE)
    
    library(tidyverse)
    
    test %>%
      group_by(Person, Initials) %>%
      summarise(Description = paste(Description, collapse = ","),
                Locations = paste(Locations, collapse = ","))
    #> `summarise()` regrouping output by 'Person' (override with `.groups` argument)
    #> # A tibble: 2 x 4
    #> # Groups:   Person [2]
    #>   Person Initials Description       Locations        
    #>   <chr>  <chr>    <chr>             <chr>            
    #> 1 Jake   JK       Info1,Info2       Mars,Jupiter     
    #> 2 Sam    SP       Info1,Info2,Info3 Saturn,Earth,Mars
    

    但请注意,您基本上是在让您的数据“不整洁”......

    【讨论】:

    • 非常感谢!这种方法非常有效。我完全忘记了 tiddyverse。我很感激帮助。 :)
    猜你喜欢
    • 1970-01-01
    • 2020-06-04
    • 2016-09-23
    • 2015-05-17
    • 1970-01-01
    • 1970-01-01
    • 2020-01-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多