Я хочу сделать аккуратные данные
Я хочу сделать распространение данных на основе дубликатов данных. Я хочу накапливать столбцы на основе перекрывающихся строк. Например, столбец X2 повторяется 5 раз.
Похоже на использование функции распространения в пакете tidyr, но немного по-другому. Не могли бы вы дать мне идею?
ВХОД:
X1 X2 X3
1 A 1 10
2 B 2 11
3 C 3 13
4 A 4 12
5 F 5 16
6 D 1 17
.
.
.
515 E 5 18
ВЫХОД:
X2 X1.1 X3.1 X1.2 X3.2 ... 102 steps
1 1 A 10 D 17
2 2 B 11
3 3 C 13
4 4 A 12
5 5 F 16
1 ответ
Решение
С dplyr
а также tidyr
мы можем сгруппировать по X2
и строить тиблы, которые мы будем unnest
в нужный формат.
Я немного изменил ваши данные, чтобы получить полный пример:
library(tidyverse)
df1 %>%
group_by(X2) %>%
summarize_all(~as.list(.) %>%
setNames(seq_along(.)) %>%
as_tibble %>%
list) %>%
unnest(.sep = ".")
# # A tibble: 3 x 5
# X2 X1.1 X1.2 X3.1 X3.2
# <int> <chr> <chr> <int> <int>
# 1 1 A A 10 12
# 2 2 B F 11 16
# 3 3 C D 13 17
И законный порядок:
df1 %>%
mutate(i = cumsum(X2 == 1)) %>%
gather(key, value, X1,X3) %>%
unite(key,key,i, sep=".") %>%
spread(key, value)
# X2 X1.1 X1.2 X3.1 X3.2
# 1 1 A A 10 12
# 2 2 B F 11 16
# 3 3 C D 13 17
данные
df1 <- read.table(header=TRUE,stringsAsFactors=FALSE,text="X1 X2 X3
1 A 1 10
2 B 2 11
3 C 3 13
4 A 1 12
5 F 2 16
6 D 3 17")