我只想将单个列中的一个级别/值的子集重塑为宽,但将选定级别保留在原始列中。
在此示例数据中,food 列中的 'rice' 和 'beans' 值没有“类型”特征。 我想保留原始列“food”及其级别“rice”和“beans”,同时将其他值设置为宽。
数据
set.seed(1)
df<-tibble(index=sample(1:5,10,replace=TRUE),food=c(rep('fruit',4),rep('meat','rice','beans'),type=c('apple','apple','banana','steak','t-bone',NA,NA))
# A tibble: 10 x 3
index food type
<int> <chr> <chr>
1 1 fruit apple
2 4 fruit apple
3 1 fruit banana
4 2 fruit banana
5 5 meat steak
6 3 meat steak
7 2 meat t-bone
8 3 meat t-bone
9 3 rice NA
10 1 beans NA
所需的输出如下:
output<-structure(list(index = c(1L,1L,4L,2L,5L,3L,3L),fruit = c("apple","banana","apple",NA),meat = c(NA,"t-bone","steak","t-bone"),food = c("beans","rice",NA)),row.names = c(NA,-7L),class = c("tbl_df","tbl","data.frame"))
output
# A tibble: 7 x 4
index fruit meat food
<int> <chr> <chr> <chr>
1 1 apple NA beans
2 1 banana NA NA
3 4 apple NA NA
4 2 banana t-bone NA
5 5 NA steak NA
6 3 NA steak rice
7 3 NA t-bone NA
我可以通过将 'rice' 和 'beans' 值移动到 'type' 列并在 'food' 列中创建相应的 'food' 级别来手动完成。除了费力和非系统的转换之外,我得到了一个意想不到的输出,其中包含重复的“beans”和“rice”值:
df1%>%mutate(type=coalesce(type,food),food=replace(food,type %in% c('rice','food'))%>%
pivot_wider(id_cols = index,names_from = c(food),values_from = c(type))%>%
unnest
# A tibble: 7 x 4
index fruit meat food
<int> <chr> <chr> <chr>
1 1 apple NA beans
2 1 banana NA beans ###<-
3 4 apple NA NA
4 2 banana t-bone NA
5 5 NA steak NA
6 3 NA steak rice
7 3 NA t-bone rice ###<-
我想知道是否有更简单、更安全的方法来使用 pivot_wider 即时完成