在列Y中的数据条件下转置列X的数据

Pau*_*ohi 4 transpose r dplyr tidyr

我有一个数据组织问题.我有这样的数据:

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
Run Code Online (Sandbox Code Playgroud)

我希望它看起来像这样:

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
Run Code Online (Sandbox Code Playgroud)

因此代码应该检查"日期"列,当它找到日期时,它会存储行号(ROW1).然后,它将检查"date"列的下一行,并且在"NA"值的情况下,程序存储它们的rownumbers(ROW y:x),直到它最终找到下一个日期(未存储下一个日期行).然后代码转到列"names"中的行y:x,并将它们的数据移动到ROW1中的新列中.在此之后,代码对于在行y:x之后找到的下一个日期执行相同的过程.

是否包含在y:x中的ROW1对我来说无关紧要,因为我已将数据放在右行中.有多个缩进日期,你可以在我的例子中看到它,我需要将它们分开.

如果你能通过提及一些有用的功能来帮助我,那将会有很大的帮助,因为我不知道如何开始这个.

Ant*_*osK 6

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>
Run Code Online (Sandbox Code Playgroud)