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

Transposing data of column X in condition of data in column Y

我有数据组织问题。我有这样的数据:

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" 值,程序将存储它们的行号(ROW y:x)直到它最终找到下一个日期(下一个日期行未存储)。然后,代码转到 "names" 列中的 y:x 行,并将它们的数据移动到 ROW1 中的新列中。此后,代码对它在行 y:x.

之后找到的下一个日期执行相同的过程

ROW1 是否包含在 y:x 中对我来说并不重要,因为我已经在正确的行中找到了该数据。有多个相同的日期,正如您在我的示例中看到的那样,我需要将它们分开。

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

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>