【问题标题】:Aggregating character rows, split and repeat聚合字符行,拆分和重复
【发布时间】:2019-06-12 15:18:03
【问题描述】:

我有这个字符数据集,

var1 <- c("10300010118,",
          "1030002,",
          "1030003,",
          "103000405, 0512,",
          "103000612, 0717,",
          "10310010618,",
          "103100221,",
          "103100315,",
          "103100412, 0517",
          "103100612,0729,",
          "14510010517,",
          "145100212,",
          "1451003,",
          "145100465, 0588,",
          "145100651, 0777,")

我想把它分成几列考虑,

  • 每 5 行应位于一行中。在这个例子中,我们有 15 行。这意味着所需的输出应该是 3 行。
  • 每五行的第一个字符(本例中为 1)应为第一列,接下来五行中的 4 个字符(例如 0300)为第二行,其余字符为最后一行。

生成的数据应该是这样的,

> data
    v1 v2    v3
1   1  0300  010118, 02, 03, 0405, 0512, 0612, 0717,
2   1  0310  010618, 0221, 0315, 0412, 0517, 0612, 0729,
3   1  4510  010517, 0212, 03, 0465, 0588, 0651, 0777,

知道怎么做吗?

【问题讨论】:

    标签: r tidyverse data-manipulation


    【解决方案1】:

    这是tidyverse 的选项。用'var1'创建data_frame,根据位置索引将separate分成三列,去掉'v3'列中字符串末尾的,,用gl创建一个分组列来分组每 5 行中的行,按 'grp'、'v1' 和 'v2' 分组,summarise 'v3' by paste将 'v3' 的元素组合成一个字符串

    library(tidyverse)
    data_frame(var1) %>% 
        separate(var1, into = paste0('v', 1:3), sep= c(1, 5)) %>% 
        mutate(v3 = str_remove(v3, ",$")) %>%
        group_by(grp = as.integer(gl(n(), 5, n())), v1, v2) %>%
        summarise(v3 = toString(v3)) %>%
        ungroup %>%
        select(-grp)
    # A tibble: 3 x 3
    #  v1    v2    v3                                       
    #  <chr> <chr> <chr>                                    
    #1 1     0300  010118, 02, 03, 0405, 0512, 0612, 0717   
    #2 1     0310  010618, 0221, 0315, 0412, 0517, 0612,0729
    #3 1     4510  010517, 0212, 03, 0465, 0588, 0651, 0777 
    

    或者我们可以在base R 中通过在提到的位置创建一个分隔符然后使用read.csv 来做到这一点

    df1 <- read.table(text= sub("^(.)(.{4})(.*),?$", "\\1-\\2-\\3", var1), 
        sep="-", header = FALSE, stringsAsFactors = FALSE, col.names = paste0("v", 1:3))
    df1$grp <- as.integer(gl(nrow(df1), 5, nrow(df1)))
    aggregate(v3 ~ ., df1, FUN = toString)[-3]
    

    【讨论】:

    • 谢谢。它只是有效,特别感谢您的解释。
    猜你喜欢
    • 1970-01-01
    • 2016-02-08
    • 2017-07-22
    • 2021-10-05
    • 2016-03-22
    • 2010-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多