所以我的数据看起来像这样:
id year principal interest
1: 011000600 2013 0.00 0.00
2: 011000600 2014 544.03 0.00
3: 011000700 2013 0.00 0.00
4: 011000700 2014 0.01 0.00
5: 011000800 2013 363.44 12.79
6: 011000800 2014 2005.98 0.00
7: 011000900 2013 0.00 0.00
8: 011000900 2014 0.00 0.00
9: 011001000 2013 0.00 0.00
10: 011001000 2014 0.00 0.00
11: 011001100 2013 0.00 0.00
12: 011001100 2014 1723.24 0.00
13: 011001560 2013 0.00 0.00
14: 011001560 2014 0.00 0.00
15: 011001650 2013 0.00 0.00
16: 011001650 2014 0.00 0.00
(基本上是一堆变量的纵向样本)
数据偏大,所以我使用data.table
来处理所有事情。我重塑它以使每个id
按行唯一:
datam<-melt(data,id=c("id","year"))
data1<-dcast.data.table(datam,id~...)
这会产生:
id 2013_principal 2013_interest 2014_principal 2014_interest
1: 011000600 0.00 0.00 544.03 0
2: 011000700 0.00 0.00 0.01 0
3: 011000800 363.44 12.79 2005.98 0
4: 011000900 0.00 0.00 0.00 0
5: 011001000 0.00 0.00 0.00 0
6: 011001100 0.00 0.00 1723.24 0
这是我想要的数据的形式,但是列名以数字开头是一个痛苦的事情。
有关如何处理此问题的任何建议?我更愿意拥有:
id principal_2013 interest_2013 principal_2014 interest_2014
1: 011000600 0.00 0.00 544.03 0
2: 011000700 0.00 0.00 0.01 0
3: 011000800 363.44 12.79 2005.98 0
4: 011000900 0.00 0.00 0.00 0
5: 011001000 0.00 0.00 0.00 0
6: 011001100 0.00 0.00 1723.24 0
(将年份换成后缀) 我在演员时试图更加明确,例如
data2<-dcast.data.table(datam,id~year+...)
data3<-dcast.data.table(datam,id~...+year)
无济于事:
data2
id 2013_principal 2013_interest 2014_principal 2014_interest
1: 011000600 0.00 0.00 544.03 0
2: 011000700 0.00 0.00 0.01 0
3: 011000800 363.44 12.79 2005.98 0
4: 011000900 0.00 0.00 0.00 0
5: 011001000 0.00 0.00 0.00 0
6: 011001100 0.00 0.00 1723.24 0
data3
id 2013_principal 2013_interest 2014_principal 2014_interest
1: 011000600 0.00 0.00 544.03 0
2: 011000700 0.00 0.00 0.01 0
3: 011000800 363.44 12.79 2005.98 0
4: 011000900 0.00 0.00 0.00 0
5: 011001000 0.00 0.00 0.00 0
6: 011001100 0.00 0.00 1723.24 0
对于dcast的命名约定来说,默认这种风格似乎很愚蠢,因为我认为这种类型的重塑是无处不在的。
我已经尝试过以前发现的其他帖子(例如here),但是它运行得非常慢(有大约400个变量需要重命名)完整的数据集)
names(data)<-ifelse(substr(names(data),1,2) %in% c("19","20"),
paste(substr(names(data),6,nchar(data)),
substr(names(data),1,4),sep="_") ,
names(copy))
(我试图找到所有以年开始的变量 - 19xx或20xx - 并尝试交换开头和结尾)
答案 0 :(得分:3)
o
dcast.data.table(dt, a ~ ... + b)
现在生成的列名称来自最后的'b'。关闭#5675。
也就是说,现在你可以这样做:
dcast.data.table(datam, id ~ ... + year)
# id principal_2013 principal_2014 interest_2013 interest_2014
# 1: 11000600 0.00 544.03 0.00 0
# 2: 11000700 0.00 0.01 0.00 0
# 3: 11000800 363.44 2005.98 12.79 0
# 4: 11000900 0.00 0.00 0.00 0
# 5: 11001000 0.00 0.00 0.00 0
# 6: 11001100 0.00 1723.24 0.00 0
# 7: 11001560 0.00 0.00 0.00 0
# 8: 11001650 0.00 0.00 0.00 0
,列名称最后会有year
个值,如预期的那样。
o?dcast.data.table现在解释了如何为正在生成的列生成名称。关闭#5676。
现在?dcast.data.table
包含添加的行:
正在转换的列的名称以相同的顺序(由_分隔)从公式RHS中提到的每列中的(唯一)值生成。
HTH
答案 1 :(得分:2)
更好的是,随着v1.9.5+的data.table中dcast
的新发展,我们可以同时投放多个列。
require(data.table) # v1.9.5+
dcast(dt, id ~ year, value.var = c("principal", "interest"))
# id principal_2013 principal_2014 interest_2013 interest_2014
# 1: 11000600 0.00 544.03 0.00 0
# 2: 11000700 0.00 0.01 0.00 0
# 3: 11000800 363.44 2005.98 12.79 0
# 4: 11000900 0.00 0.00 0.00 0
# 5: 11001000 0.00 0.00 0.00 0
# 6: 11001100 0.00 1723.24 0.00 0
# 7: 11001560 0.00 0.00 0.00 0
# 8: 11001650 0.00 0.00 0.00 0
在melt
之前不再需要cast
,因此非常有效。
答案 2 :(得分:1)
@ Arun的解决方案是将公式的右手显式设置为您希望命名列的顺序。
data1 <- dcast.data.table(datam,id ~ variable+year, value.var="value")