使用非数字值重新整形R中的数据帧

时间:2016-03-05 03:12:11

标签: r

我有一个非数字值的数据框,格式如下:

DF1:

  col1    col2
1  a       b
2  a       c
3  z       y
4  z       x
5  a       d
6  m       n

我需要将其转换为这种格式,

DF2:

  col1    col2    col3    col4
1  a        b       c       d
2  z        y       x       NA
3  m        n       NA      NA

以col1为主键(不确定这是否是R中的正确术语),其余列包含与该键关联的元素(如DF1所示)。

与DF1相比,DF2将包括更多列,具体取决于与任何键相关联的元素数量。

某些列没有由与每个键关联的不同数量的元素产生的值,表示为NA(如DF2中所示)。

列名可以是任何内容。

我尝试使用reshape(),melt()+ cast(),甚至是一个泛型for循环,我使用cbind并尝试删除该行。

它是超大5000万行的大数据集的一部分。我可能不得不使用云服务来完成这项任务,但这是一个不同的讨论。

我是R的新手,所以可能会有一些我不知道的明显解决方案。

非常感谢任何帮助。

-Thanks

2 个答案:

答案 0 :(得分:3)

如果这是一个大数据集,我们可以使用data.table

library(data.table)
setDT(DF1)[, i1:=paste0("col", seq_len(.N)+1L), col1]
dcast(DF1, col1~i1, value.var='col2')
#    col1 col2 col3 col4
#1:    a    b    c    d
#2:    m    n   NA   NA
#3:    z    y    x   NA

答案 1 :(得分:2)

使用dplyrtidyr

library(tidyr)
library(dplyr)

DF <- data_frame(col1 = c("a", "a", "z", "z", "a", "m"),
                 col2 = c("b", "c", "y", "x", "d", "n"))
# you need to another column as key value for spreading
DF %>%
  group_by(col1) %>%
  mutate(colname = paste0("col", 1:n() + 1)) %>%
  spread(colname, col2)
#> Source: local data frame [3 x 4]
#> Groups: col1 [3]
#> 
#>    col1  col2  col3  col4
#>   (chr) (chr) (chr) (chr)
#> 1     a     b     c     d
#> 2     m     n    NA    NA
#> 3     z     y     x    NA