无唯一ID执行pivot_wider生成NA值问题求助
问题:将长格式iris恢复为原始宽格式时出现大量NA值
你尝试将长格式iris转回原始宽格式,但执行pivot_wider后出现大量NA,代码及输出如下:
library(tidyverse) # pivot_longer iris_longer <- iris %>% pivot_longer(cols = -c(Species), names_to = "feature", values_to = "value") # 尝试恢复原始结构 iris_longer %>% mutate(row = row_number()) %>% pivot_wider(names_from = feature, values_from = value, id_cols = c(row, Species)) %>% arrange(row) %>% select(-row) #> # A tibble: 600 × 5 #> Species Sepal.Length Sepal.Width Petal.Length Petal.Width #> <fct> <dbl> <dbl> <dbl> <dbl> #> 1 setosa 5.1 NA NA NA #> 2 setosa NA 3.5 NA NA #> 3 setosa NA NA 1.4 NA #> 4 setosa NA NA NA 0.2 #> 5 setosa 4.9 NA NA NA #> 6 setosa NA 3 NA NA #> 7 setosa NA NA 1.4 NA #> 8 setosa NA NA NA 0.2 #> 9 setosa 4.7 NA NA NA #> 10 setosa NA 3.2 NA NA #> # ℹ 590 more rows
问题原因
你用mutate(row = row_number())给长格式的每一行分配了唯一编号,但长格式共有600行(150个原始样本×4个特征)。pivot_wider会把每个唯一编号对应的行单独拆成一行,每行只包含一个特征的值,其他自然显示为NA。
解决方法
核心是给同一个原始样本的所有特征行分配相同的组ID,让pivot_wider识别出哪些行属于同一个原始样本,从而合并到同一行。
方法一:转长格式前先添加样本ID
在转长格式前,先给原始宽格式的每一行(每个样本)分配唯一ID,转长后同一个样本的4个特征行会共享这个ID:
library(tidyverse) # 转长格式前添加样本ID iris_longer <- iris %>% mutate(sample_id = row_number()) %>% # 每个原始样本对应唯一ID pivot_longer(cols = -c(sample_id, Species), names_to = "feature", values_to = "value") # 恢复宽格式 iris_restored <- iris_longer %>% pivot_wider( names_from = feature, values_from = value, id_cols = c(sample_id, Species) ) %>% arrange(sample_id) %>% select(-sample_id) # 移除临时ID # 查看结果 head(iris_restored)
方法二:对已有的长格式数据补充分组ID
如果已经得到了长格式数据,可以按Species分组后,给每组内的行分配重复的ID(每个物种有50个样本,每个样本对应4个特征行):
iris_restored <- iris_longer %>% group_by(Species) %>% mutate(sample_id = rep(1:50, each = 4)) %>% # 每个样本重复4次ID ungroup() %>% pivot_wider( names_from = feature, values_from = value, id_cols = c(sample_id, Species) ) %>% arrange(sample_id) %>% select(-sample_id) # 验证结果是否与原始iris一致 all.equal(iris_restored, iris)
两种方法都能让pivot_wider正确合并同一样本的特征值,不会产生NA。
内容的提问来源于stack exchange,提问作者Ramakrishna S
相关产品推荐
相关产品推荐

