我想要实现的目标是获取一个数据框列,这是一个因素,为每个级别创建一个新列,并使用原始数据框中该级别的相应值填充该列。
这是一个示例。在这种情况下,我想为the.name
因子列的每个级别创建一个新列,如下所示:
原始数据框:
symbol the.name cn
SYM1 ABC 1
SYM2 ABC 2
SYM1 DEF 3
SYM2 DEF 4
产生的数据框:
symbol ABC DEF
SYM1 1 3
SYM2 2 4
如何做到这一点?
编辑:我尝试使用sapply
循环来实现此目标,然后使用split
列,然后rbind
结果。但是,我没有让它工作,并选择不将它添加到这个问题,因为它会产生噪音 - 我很确定这种方法不正确,可以大大改进。
答案 0 :(得分:5)
这是dcast
包中reshape2
的作业:
> dcast(df, symbol~the.name, value.var="cn")
symbol ABC DEF
1 SYM1 1 3
2 SYM2 2 4
答案 1 :(得分:5)
这是一项重塑任务(从长数据到宽数据)。包reshape2
有一些很棒的实用工具可以做到这一点。
txt="symbol the.name cn
SYM1 ABC 1
SYM2 ABC 2
SYM1 DEF 3
SYM2 DEF 4"
tmp <- read.table(text=txt, header=TRUE)
library(reshape2)
dcast(tmp, symbol ~ the.name) ## as easy as that
答案 2 :(得分:5)
或者,newish tidyr
包提供了“spread”功能。使用@ ilir的数据
> tidyr::spread(tmp, key = the.name, value = cn)
symbol ABC DEF
1 SYM1 1 3
2 SYM2 2 4