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对我来说无关紧要,因为我已将数据放在右行中.有多个缩进日期,你可以在我的例子中看到它,我需要将它们分开.
如果你能通过提及一些有用的功能来帮助我,那将会有很大的帮助,因为我不知道如何开始这个.
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)