为什么在 R 中熔体返回 NA 列?

问题描述

我在 R 中有以下列表 df

structure(list(disease = structure(c(1L,1L),.Label = "Barcelona",class = "factor"),`<18` = structure(list(0.193103448275862,0.0445344129554656),.Names = c(NA_character_,NA_character_
    )),`19-25` = structure(list(0.0413793103448276,0.345748987854251),`26-64` = structure(list(0.448275862068966,0.167611336032389),NA_character_)),`46-64` = structure(list(0.0344827586206897,0.00647773279352227),`>65` = structure(list(0.282758620689655,0.435627530364373),type = structure(1:2,.Label = c("Clinical Trial","Real-World"
    ),class = "factor")),class = "data.frame",row.names = c(NA,-2L))

我想重新排列数据框,以便我可以使用 melt 按城市、单位和年龄组获取每个值。但是,我得到了一个额外的列作为输出

melt(df)
           city           type           variable      value          NA
1  Barcelona       flat                  <18           0.19310345 0.044534413
2  Barcelona       house                 <18           0.19310345 0.044534413
3  Barcelona       flat                  19 - 25       0.04137931 0.345748988
4  Barcelona       house                 19 - 25       0.04137931 0.345748988
5  Barcelona       flat                  26 - 45       0.44827586 0.167611336
6  Barcelona       house                 26 - 45       0.44827586 0.167611336
7  Barcelona       flat                  46 - 64       0.03448276 0.006477733
8  Barcelona       house                 46 - 64       0.03448276 0.006477733
9  Barcelona       flat                  > 65          0.28275862 0.435627530
10 Barcelona       house                 > 65          0.28275862 0.435627530

有没有办法不使用 NA 列并在 value 列中获得唯一值?

解决方法

问题是您的度量列是 list 类,而不是 numeric 类。如果我们将它们转换为数字,melt 将正常工作。 (我展示了一种方法,但最好在您的工作流中更早地进行并首先防止将列创建为列表......如果我的代码适用于您的代码,这绝对是您应该做的样本数据在较大数据上遇到问题。在这种情况下,tidyr::unnest 可能会有所帮助。)

sapply(df,class)
#  disease      <18    19-25    26-64    46-64      >65     type 
# "factor"   "list"   "list"   "list"   "list"   "list" "factor" 

list_cols = sapply(df,is.list)

df[list_cols] = lapply(df[list_cols],unlist)

reshape2::melt(df,id.vars = c("disease","type"))
#      disease           type variable       value
# 1  Barcelona Clinical Trial      <18 0.193103448
# 2  Barcelona     Real-World      <18 0.044534413
# 3  Barcelona Clinical Trial    19-25 0.041379310
# 4  Barcelona     Real-World    19-25 0.345748988
# 5  Barcelona Clinical Trial    26-64 0.448275862
# 6  Barcelona     Real-World    26-64 0.167611336
# 7  Barcelona Clinical Trial    46-64 0.034482759
# 8  Barcelona     Real-World    46-64 0.006477733
# 9  Barcelona Clinical Trial      >65 0.282758621
# 10 Barcelona     Real-World      >65 0.435627530