dcast 重命名所有变量以数字开头

Mic*_*ico 5 r reshape2 data.table

所以我得到的数据如下所示:

           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
Run Code Online (Sandbox Code Playgroud)

(基本上是一堆变量的纵向样本)

数据量很大,所以我可以用来data.table做所有事情。我重塑它以使每个id行都唯一:

datam<-melt(data,id=c("id","year"))
data1<-dcast.data.table(datam,id~...)
Run Code Online (Sandbox Code Playgroud)

这产生:

          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
Run Code Online (Sandbox Code Playgroud)

这当然是我想要的数据形式,但是列名以数字开头是一件痛苦的事。

对于如何处理这个问题有什么建议吗?我更愿意:

          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
Run Code Online (Sandbox Code Playgroud)

(将年份切换为后缀)我尝试在铸造时更加明确,例如

data2<-dcast.data.table(datam,id~year+...)
data3<-dcast.data.table(datam,id~...+year)
Run Code Online (Sandbox Code Playgroud)

无济于事:

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
Run Code Online (Sandbox Code Playgroud)

考虑到我认为这种类型的重塑是普遍存在的,因此 dcast 的命名约定默认为这种风格似乎很愚蠢。

我还尝试根据我发现的其他一些帖子(例如此处)事后修补一些内容,但它运行速度慢得令人难以置信(完整数据集中大约有 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))
Run Code Online (Sandbox Code Playgroud)

(我试图找到以年份开头的所有变量 - 19xx 或 20xx - 并尝试交换开头和结尾)

Aru*_*run 3

更好的是,随着v1.9.5+dcast中 data.table的新发展,我们可以同时转换多个列。

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
Run Code Online (Sandbox Code Playgroud)

melt之前不再需要不必要的操作cast,因此非常高效。