代码之家  ›  专栏  ›  技术社区  ›  Pauli Lohi

在Y列数据的情况下对X列数据进行转置

  •  4
  • Pauli Lohi  · 技术社区  · 7 年前

    我有一个数据组织问题。我有如下数据:

    ROW   date      names
    1     1.1.2000  A
    2     NA        B
    3     NA        C
    4     1.1.2000  X
    5     NA        Y
    6     2.1.2000  Z
    

    我希望它看起来像这样:

    ROW   date      name1 name2 name3 name4
    1     1.1.2000  A     B     C     NA
    2     1.1.2000  X     Y     NA    NA
    3     2.1.2000  Z     NA    NA    NA
    

    因此,代码应该检查列“date”,当它找到一个日期时,它存储行号(ROW1)。然后,它将检查“date”列的下一行,如果是“NA”值,程序将存储它们的行号(行y:x),直到最后找到下一个日期(不存储下一个日期行)。然后,代码转到“名称”列中的y:x行,并将其数据移动到第1行的新列中。在此之后,代码对第y:x行之后找到的下一个日期执行相同的过程。

    行1是否包含在y:x中对我来说无关紧要,因为我的数据已经在右边的行中了。在我的示例中可以看到,有多个标识日期,我需要将它们分开。

    如果你能帮助我,甚至提到一些有用的功能,这将帮助很大,因为我不知道如何开始这一点。

    1 回复  |  直到 7 年前
        1
  •  6
  •   AntoniosK    7 年前
    library(dplyr)
    library(tidyr)
    
    df = read.table(text = "
    ROW   date      names
    1     1.1.2000  A
    2     NA        B
    3     NA        C
    4     1.1.2000  X
    5     NA        Y
    6     2.1.2000  Z
    ", header=T, stringsAsFactors=F)
    
    df %>%
      group_by(ROW = cumsum(!is.na(date))) %>%       # create the rows of updated dataset based on rows without NAs; for each new row:
      mutate(counter = row_number(),                 # count how many columns you need for each new row
             date = unique(date[!is.na(date)])) %>%  # keep unique date after excluding NAs
      ungroup() %>%                                  # forget the grouping
      mutate(counter = paste0("name",counter)) %>%   # update variable to use as column names
      spread(counter, names)                         # reshape dataset
    
    # # A tibble: 3 x 5
    #     ROW     date name1 name2 name3
    # * <int>    <chr> <chr> <chr> <chr>
    # 1     1 1.1.2000     A     B     C
    # 2     2 1.1.2000     X     Y  <NA>
    # 3     3 2.1.2000     Z  <NA>  <NA>