当type列存在NA值时,如何在R中正确透视tidy数据?
解决方案
这里提供两种简洁的tidyverse实现方式:
方法1:先填充缺失的type值再透视
先按ID分组,将每个ID中type列的NA替换为该ID内的有效type值(这里是3),之后再执行透视操作,最后去重得到目标结果:
library(tidyverse) test <- data.frame(ID = c(rep(1, 3), rep(2,3), rep(3,3)), type = rep(c(3,3,NA),3), label = rep(c("test1", "test2", "test3"),3), value = rep(5:7,3)) test %>% group_by(ID) %>% mutate(type = replace_na(type, first(na.omit(type)))) %>% pivot_wider(names_from = label, values_from = value) %>% distinct()
运行后输出:
# A tibble: 3 × 5 # Groups: ID [3] ID type test1 test2 test3 <dbl> <dbl> <int> <int> <int> 1 1 3 5 6 7 2 2 3 5 6 7 3 3 3 5 6 7
方法2:先透视再合并同ID的列值
先执行透视得到初始结果,再按ID分组,对每个列提取第一个非缺失值,实现同ID行的合并:
test %>% pivot_wider(names_from = label, values_from = value) %>% group_by(ID) %>% summarize( type = first(na.omit(type)), test1 = first(na.omit(test1)), test2 = first(na.omit(test2)), test3 = first(na.omit(test3)) )
此方法同样会得到你期望的输出结果。
内容的提问来源于stack exchange,提问作者vizidea
相关产品推荐
相关产品推荐

