我有一个非数字值的数据框,格式如下:
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
答案 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)
使用dplyr
和tidyr
:
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