【发布时间】:2021-12-08 09:27:02
【问题描述】:
我正在尝试扩大 R 中的数据框,但这似乎以一种不寻常的方式,因为在此处进行大量搜索后,我无法找到一种简单的方法。
假设我有一个这样的数据框,其中 ID 是一个数字,用于标识一个独特的人,这个独特的人可能有几个与之关联的代码:
ID<-c(1, 2, 2, 2, 3, 3,4)
CODE<-c(123, 938, 293, 456, 203, 203, 91)
df <- data.frame(ID, CODE)
我想扩大它,使每个 ID 只有一行,并将代码添加到其他列。这将导致生成与具有最多关联代码的 ID 的代码一样多的新列。例如,如果一个 ID 只有一个代码,那么在第一个之后的所有新生成的列都应该用 NA 填充。生成的数据框应如下所示:
| ID | CODE1 | CODE2 | CODE3 |
|---|---|---|---|
| 1 | 123 | NA | NA |
| 2 | 938 | 293 | 456 |
| 3 | 203 | 203 | NA |
| 4 | 91 | NA | NA |
如果重复的代码也可以被删除,结果会更好(这样 ID 3 的第二次出现的 203 变为 NA):
| ID | CODE1 | CODE2 | CODE3 |
|---|---|---|---|
| 1 | 123 | NA | NA |
| 2 | 938 | 293 | 456 |
| 3 | 203 | NA | NA |
| 4 | 91 | NA | NA |
我可以通过连接代码(通过 group_by 和 summarise)然后将代码分成单独的列来做到这一点,但我想有一种更直接的方法来做到这一点。
感谢您的任何建议!
【问题讨论】:
-
你试过 tidyr 包中的 pivot_wider() 函数了吗?
-
我有,但结果 df 不是我想要的(至少我知道如何使用此功能的方式)。函数 pivot_wider() 导致每个唯一代码一列。我的真实数据集中有数千个唯一代码(和数万个 ID),因此为每个代码创建一列会使数据集太大而无法实际使用。除非有办法以我想要的方式使用 pivot_wider(),但我还没有找到?
-
无论是使用 pivot_wider() 还是其他方式,这都是从高到宽转置的预期行为。为避免在一行中出现重复代码,请在转置之前尝试 distinct(df, ID, CODE)。