R:将行旋转为列,并使用N/A';s表示缺少值

R:将行旋转为列,并使用N/A';s表示缺少值,r,dataframe,pivot,reshape,melt,R,Dataframe,Pivot,Reshape,Melt,我有一个看起来像这样的数据框 NUM <- c("45", "45", "45", "45", "48", "50", "66", "66", "66", "68") Type <- c("A", "F", "C", "B", "D", "A", "E", "C", "F", "D") Points <- c(9.2,60.8,22.9,1012.7,18.7,11.1,67.2,63.1,16.7,58.4) df1 <- data.frame(NUM,Type,Po

我有一个看起来像这样的数据框

NUM <- c("45", "45", "45", "45", "48", "50", "66", "66", "66", "68")
Type <- c("A", "F", "C", "B", "D", "A", "E", "C", "F", "D")
Points <- c(9.2,60.8,22.9,1012.7,18.7,11.1,67.2,63.1,16.7,58.4)

df1 <- data.frame(NUM,Type,Points)
我试图获得一个输出,该输出将type column中的行转换为单个列

期望输出:

+-----+----------+----------+----------+----------+----------+----------+
| NUM | Points.A | Points.B | Points.C | Points.D | Points.E | Points.F |
+-----+----------+----------+----------+----------+----------+----------+
|  45 | 9.2      | 1012.7   | 22.9     | N/A      | N/A      | 60.8     |
|  48 | N/A      | N/A      | N/A      | 18.7     | N/A      | N/A      |
|  50 | 11.1     | N/A      | N/A      | N/A      | N/A      | N/A      |
|  66 | N/A      | N/A      | 63.1     | N/A      | 67.2     | 16.7     |
|  65 | N/A      | N/A      | N/A      | N/A      | 58.4     | N/A      |
+-----+----------+----------+----------+----------+----------+----------+

我尝试使用melt(df1),但做得不对,因为行中的值是NUM值,而不是points。请告诉我如何着手解决这个问题

您可以尝试
dcast

library(reshape2)
dcast(df1, NUM~paste0('Points.',Type), value.var='Points')
或者您可以转换为data.table并使用data.table中的
dcast
。它会更快

library(data.table)#v1.9.5+
dcast(setDT(df1), NUM~paste0('Points.',Type), value.var='Points')

您正在寻找一个从“长”到“宽”的基本整形过程

在base R中,可以使用
整形
。对于这种类型的数据,语法非常简单:

reshape(df1, direction = "wide", idvar = "NUM", timevar = "Type")
#    NUM Points.A Points.F Points.C Points.B Points.D Points.E
# 1   45      9.2     60.8     22.9   1012.7       NA       NA
# 5   48       NA       NA       NA       NA     18.7       NA
# 6   50     11.1       NA       NA       NA       NA       NA
# 7   66       NA     16.7     63.1       NA       NA     67.2
# 10  68       NA       NA       NA       NA     58.4       NA
您也可以使用“tidyr”包,对于几个函数,只需包装
restrape2
,但使用不同的语法。在本例中,语法为:

> library(tidyr)
> spread(df1, Type, Points)

melt
使事物变长
dcast
使事情变得广泛(也可以进行聚合)。或者
library(tidyr);散布(df1,类型,点数)
效果很好!!谢谢你,阿南达。我刚刚在我的数据集上实现了重塑和扩展函数,看起来它们在生成结果时占用的时间几乎相同。你知道哪一个性能更好吗?@Sharath,取决于数据集的大小。一般来说,您将从“data.table”的开发版本中获得更多的收益,该版本具有快速熔化和铸造功能,并且超出了“Reforme2”的功能范围。也就是说,我通常不喜欢使用包的开发版本来提供答案……工作非常出色。dcast比大型数据集上的传播速度快吗?@Sharath对于大型数据集,我会将“data.frame”转换为“data.table”,并从data.table使用
dcast
。非常感谢你的建议。看起来连阿南达也提出了同样的建议。我将把它转换为data.table,然后对更大的数据集使用dcast。
> library(tidyr)
> spread(df1, Type, Points)