在 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>
我有数据组织问题。我有这样的数据:
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>