С помощью 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")