在 data.table 中重塑
Reshaping in data.table
编辑:我稍微编辑了我的问题,因为建议的解决方案对我的数据集来说有点问题。 OP写在下面。
我有一个数据集 df,其中 prop
是那一年的观察量占总观察量的一部分。例如:对于荷兰 (NLD),60% 的观测值是 2005 年。对于保加利亚 (BLG),这是 50%。
row country year prop
1: 1 NLD 2005 0.6
2: 2 NLD 2005 0.6
3: 3 BLG 2006 0.5
4: 4 BLG 2005 0.5
5: 5 GER 2005 1.0
6: 6 NLD 2007 0.2
7: 7 NLD 2005 0.6
8: 8 NLD 2008 0.2
我想要得到的是:
row country prop2005 prop2006 prop2007 prop 2008
1: 1 NLD 0.6 0.0 0.2 0.2
2: 2 NLD 0.6 0.0 0.2 0.2
3: 3 NLD 0.6 0.0 0.2 0.2
4: 4 BLG 0.5 0.5 0.0 0.0
5: 5 BLG 0.5 0.5 0.0 0.0
6: 6 BLG 0.5 0.5 0.0 0.0
7: 7 GER 1.0 0.0 0.0 0.0
8: 8 GER 1.0 0.0 0.0 0.0
9: 9 GER 1.0 0.0 0.0 0.0
原版POST:
我有一个数据集 df,其中 prop
是那一年的观察量占总观察量的一部分。例如:对于荷兰 (NLD),60% 的观测值是 2005 年。对于保加利亚 (BLG),这是 50%。
row country year prop
1: 1 NLD 2005 0.6
2: 2 NLD 2005 0.6
3: 3 BLG 2006 0.5
4: 4 BLG 2005 0.5
5: 5 GER 2005 1.0
6: 6 NLD 2007 0.2
7: 7 NLD 2005 0.6
8: 8 NLD 2008 0.2
我想将这些值连接到不同的数据集(df2
,其中有与那些年相关的问题),如下所示:
row country q05 q06 q07 q08
1: 1 NLD 1 2 1 3
2: 2 NLD 2 1 2 3
3: 3 NLD 1 2 2 4
4: 4 BLG 5 5 2 4
5: 5 BLG 1 2 1 1
6: 6 BLG 2 2 5 1
7: 7 GER 3 5 4 4
8: 8 GER 2 5 3 4
9: 9 GER 1 2 3 5
我想要得到的是:
row country prop2005 prop2006 prop2007 prop 2008
1: 1 NLD 1 2 1 3 0.6 0.0 0.2 0.2
2: 2 NLD 2 1 2 3 0.6 0.0 0.2 0.2
3: 3 NLD 1 2 2 4 0.6 0.0 0.2 0.2
4: 4 BLG 5 5 2 4 0.5 0.5 0.0 0.0
5: 5 BLG 1 2 1 1 0.5 0.5 0.0 0.0
6: 6 BLG 2 2 5 1 0.5 0.5 0.0 0.0
7: 7 GER 3 5 4 4 1.0 0.0 0.0 0.0
8: 8 GER 2 5 3 4 1.0 0.0 0.0 0.0
9: 9 GER 1 2 3 5 1.0 0.0 0.0 0.0
换句话说,对于每一次观察,我都希望将与该国家相关的比例添加到观察中(因为它们的作用就像一个权重)。
我相当熟悉 data.table;
中的合并
df1 <- merge(df1, df2, by= "country", all.x = TRUE, allow.cartesian=FALSE)
但是,我真的不知道如何重塑 data.table 以正确合并它。
有什么建议吗?
当前 "SOLUTION":
df1 <- dcast(df1, country~year, value="prop")
df1 <- merge(df1, df2, by= "country", all.x = TRUE, allow.cartesian=FALSE)
可能的解决方案:
melt(df2, id = 1:2, value.name = 'q'
)[, year := as.integer(paste0('20',sub('\D+','',variable)))
][df, on = .(country, year), prop := i.prop
][is.na(prop), prop := 0
][, dcast(.SD, row + country ~ year, value.var = c('q','prop'), sep = '')]
给出:
row country q2005 q2006 q2007 q2008 prop2005 prop2006 prop2007 prop2008
1: 1 NLD 1 2 1 3 0.6 0.0 0.2 0.2
2: 2 NLD 2 1 2 3 0.6 0.0 0.2 0.2
3: 3 NLD 1 2 2 4 0.6 0.0 0.2 0.2
4: 4 BLG 5 5 2 4 0.5 0.5 0.0 0.0
5: 5 BLG 1 2 1 1 0.5 0.5 0.0 0.0
6: 6 BLG 2 2 5 1 0.5 0.5 0.0 0.0
7: 7 GER 3 5 4 4 1.0 0.0 0.0 0.0
8: 8 GER 2 5 3 4 1.0 0.0 0.0 0.0
9: 9 GER 1 2 3 5 1.0 0.0 0.0 0.0
要查看其工作原理,您可以将代码分成几个步骤,如下所示:
df3 <- melt(df2, id = 1:2, value.name = 'q')[, year := as.integer(paste0('20',sub('\D+','',variable)))]
df3[df, on = .(country, year), prop := i.prop][]
df3[is.na(prop), prop := 0][]
df3[, dcast(.SD, row + country ~ year, value.var = c('q','prop'), sep = '')]
编辑:我稍微编辑了我的问题,因为建议的解决方案对我的数据集来说有点问题。 OP写在下面。
我有一个数据集 df,其中 prop
是那一年的观察量占总观察量的一部分。例如:对于荷兰 (NLD),60% 的观测值是 2005 年。对于保加利亚 (BLG),这是 50%。
row country year prop
1: 1 NLD 2005 0.6
2: 2 NLD 2005 0.6
3: 3 BLG 2006 0.5
4: 4 BLG 2005 0.5
5: 5 GER 2005 1.0
6: 6 NLD 2007 0.2
7: 7 NLD 2005 0.6
8: 8 NLD 2008 0.2
我想要得到的是:
row country prop2005 prop2006 prop2007 prop 2008
1: 1 NLD 0.6 0.0 0.2 0.2
2: 2 NLD 0.6 0.0 0.2 0.2
3: 3 NLD 0.6 0.0 0.2 0.2
4: 4 BLG 0.5 0.5 0.0 0.0
5: 5 BLG 0.5 0.5 0.0 0.0
6: 6 BLG 0.5 0.5 0.0 0.0
7: 7 GER 1.0 0.0 0.0 0.0
8: 8 GER 1.0 0.0 0.0 0.0
9: 9 GER 1.0 0.0 0.0 0.0
原版POST:
我有一个数据集 df,其中 prop
是那一年的观察量占总观察量的一部分。例如:对于荷兰 (NLD),60% 的观测值是 2005 年。对于保加利亚 (BLG),这是 50%。
row country year prop
1: 1 NLD 2005 0.6
2: 2 NLD 2005 0.6
3: 3 BLG 2006 0.5
4: 4 BLG 2005 0.5
5: 5 GER 2005 1.0
6: 6 NLD 2007 0.2
7: 7 NLD 2005 0.6
8: 8 NLD 2008 0.2
我想将这些值连接到不同的数据集(df2
,其中有与那些年相关的问题),如下所示:
row country q05 q06 q07 q08
1: 1 NLD 1 2 1 3
2: 2 NLD 2 1 2 3
3: 3 NLD 1 2 2 4
4: 4 BLG 5 5 2 4
5: 5 BLG 1 2 1 1
6: 6 BLG 2 2 5 1
7: 7 GER 3 5 4 4
8: 8 GER 2 5 3 4
9: 9 GER 1 2 3 5
我想要得到的是:
row country prop2005 prop2006 prop2007 prop 2008
1: 1 NLD 1 2 1 3 0.6 0.0 0.2 0.2
2: 2 NLD 2 1 2 3 0.6 0.0 0.2 0.2
3: 3 NLD 1 2 2 4 0.6 0.0 0.2 0.2
4: 4 BLG 5 5 2 4 0.5 0.5 0.0 0.0
5: 5 BLG 1 2 1 1 0.5 0.5 0.0 0.0
6: 6 BLG 2 2 5 1 0.5 0.5 0.0 0.0
7: 7 GER 3 5 4 4 1.0 0.0 0.0 0.0
8: 8 GER 2 5 3 4 1.0 0.0 0.0 0.0
9: 9 GER 1 2 3 5 1.0 0.0 0.0 0.0
换句话说,对于每一次观察,我都希望将与该国家相关的比例添加到观察中(因为它们的作用就像一个权重)。
我相当熟悉 data.table;
中的合并df1 <- merge(df1, df2, by= "country", all.x = TRUE, allow.cartesian=FALSE)
但是,我真的不知道如何重塑 data.table 以正确合并它。
有什么建议吗?
当前 "SOLUTION":
df1 <- dcast(df1, country~year, value="prop")
df1 <- merge(df1, df2, by= "country", all.x = TRUE, allow.cartesian=FALSE)
可能的解决方案:
melt(df2, id = 1:2, value.name = 'q'
)[, year := as.integer(paste0('20',sub('\D+','',variable)))
][df, on = .(country, year), prop := i.prop
][is.na(prop), prop := 0
][, dcast(.SD, row + country ~ year, value.var = c('q','prop'), sep = '')]
给出:
row country q2005 q2006 q2007 q2008 prop2005 prop2006 prop2007 prop2008 1: 1 NLD 1 2 1 3 0.6 0.0 0.2 0.2 2: 2 NLD 2 1 2 3 0.6 0.0 0.2 0.2 3: 3 NLD 1 2 2 4 0.6 0.0 0.2 0.2 4: 4 BLG 5 5 2 4 0.5 0.5 0.0 0.0 5: 5 BLG 1 2 1 1 0.5 0.5 0.0 0.0 6: 6 BLG 2 2 5 1 0.5 0.5 0.0 0.0 7: 7 GER 3 5 4 4 1.0 0.0 0.0 0.0 8: 8 GER 2 5 3 4 1.0 0.0 0.0 0.0 9: 9 GER 1 2 3 5 1.0 0.0 0.0 0.0
要查看其工作原理,您可以将代码分成几个步骤,如下所示:
df3 <- melt(df2, id = 1:2, value.name = 'q')[, year := as.integer(paste0('20',sub('\D+','',variable)))]
df3[df, on = .(country, year), prop := i.prop][]
df3[is.na(prop), prop := 0][]
df3[, dcast(.SD, row + country ~ year, value.var = c('q','prop'), sep = '')]