我正在尝试格式化这些数据,以将其馈送到格式化表中。
样本数据:
test <- tibble(group = c("A", "B", "B", "B", "C", "D"),
name = c("Steve", "Mike", "Paul", "Jaimie", "John", "Marco"),
year = c(1988, 2001, 2001, 2002, 1997, 2000))
它给出:
# A tibble: 6 x 3
group name year
<chr> <chr> <dbl>
1 A Steve 1988
2 B Mike 2001
3 B Paul 2001
4 B Jaimie 2002
5 C John 1997
6 D Marco 2000
我希望格式化表中有group
和year
作为列,所以我按排列
test %>%
mutate(grouped_id = row_number()) %>%
spread(key = year, value = name)
它给出:
# A tibble: 6 x 7
group grouped_id `1988` `1997` `2000` `2001` `2002`
<chr> <int> <chr> <chr> <chr> <chr> <chr>
1 A 1 Steve NA NA NA NA
2 B 2 NA NA NA Mike NA
3 B 3 NA NA NA Paul NA
4 B 4 NA NA NA NA Jaimie
5 C 5 NA John NA NA NA
6 D 6 NA NA Marco NA NA
对于组"B",我希望列2002
中的"Jaimie"折叠到组"B(的第一行,这样组"B(B("就没有三行了。结果应该是这样的:
# A tibble: 6 x 7
group grouped_id `1988` `1997` `2000` `2001` `2002`
<chr> <int> <chr> <chr> <chr> <chr> <chr>
1 A 1 Steve NA NA NA NA
2 B 2 NA NA NA Mike Jaimie
3 B 3 NA NA NA Paul NA
4 C 5 NA John NA NA NA
5 D 6 NA NA Marco NA NA
我试过这个和这个。
谢谢你的帮助。
我们可以通过row_number
进行分组
library(dplyr)
library(tidyr)
test %>%
group_by(year) %>%
mutate(rn = row_number()) %>%
ungroup %>%
spread(year, name) %>%
select(-rn)
# A tibble: 5 x 6
# group `1988` `1997` `2000` `2001` `2002`
# <chr> <chr> <chr> <chr> <chr> <chr>
#1 A Steve <NA> <NA> <NA> <NA>
#2 B <NA> <NA> <NA> Mike Jaimie
#3 B <NA> <NA> <NA> Paul <NA>
#4 C <NA> John <NA> <NA> <NA>
#5 D <NA> <NA> Marco <NA> <NA>
在较新版本的tidyr
中,最好使用pivot_wider
test %>%
group_by(year) %>%
mutate(rn = row_number()) %>%
ungroup %>%
pivot_wider(names_from = year, values_from = name) %>%
select(-rn)