r - 重塑长到宽添加额外的列
问题描述
我有一个看起来像这样的数据框:
ID X Y
1 A A
1 B A
2 C A
3 A K
3 A A
到目前为止,我能找到的所有用于重复测量等的解决方案都依赖于一个指标,该指标在所有观察结果中都不同,但在我的情况下,我没有。我基本上想总结ID
数据集中每个行的所有观察结果。
最后它应该看起来像这样的宽格式
ID X1 Y1 X2 Y2
1 A A B A
2 C A NA NA #since there is only one observation for 2 the values for X2 and Y2 should be NA
3 A K A A
知道怎么做吗?如果可能的话,我更愿意使用data.table
。
解决方案
library(data.table)
setDT(df)
melt(df, 1)[, i := paste(variable, 1:.N, sep = "_"),
keyby = .(ID, variable)][, dcast(.SD, ID ~ i),
.SDcols = c("ID", "value", "i")]
> ID X_1 X_2 Y_1 Y_2
1: 1 A B A A
2: 2 C <NA> A <NA>
3: 3 A A K A
你有:
- 首先你融化数据,所以你有一列下的所有 X 和 Y 值
- 然后你创建一个新变量,告诉你这是第一个还是第二个 X 或 Y,按 ID 和变量分组(所以它们是有意义的)
- 然后你转换到该表的宽度,保留
ID
为一列,并将新变量作为列标题。您删除了该列variable
,因为您已经对其进行了编码i
。
推荐阅读
- scala - 从 UDF 内的 Spark SQL 行中提取嵌套数组
- wicket - Wicket 从 1.4.9 迁移到 7.9.0 后 Wiquery 1.0.2 jar 抛出错误
- java - SQL 插入 '
- php - PHP 在 eloquent 模型中运行原始 SQL 查询
- python - Pandas 中的布尔索引
- ios - 单击Objective-C中的tableview标题时显示/隐藏Tableview单元格
- php - 使用 .htaccess 处理像 www 根目录这样的目录
- eclipse - 如何为多用户 Eclipse 安装的每个用户指定唯一的 java.io.tmpdir?
- python - Kivy 自定义事件传播
- unit-testing - ABAP 代码中的 TEST-INJECTION 和 TEST-SEAM