重组复杂的大型数据框
Restructuring complicated and large dataframe
我有一个包含 41040 个观测值的大型数据框。和 20 个变量。
在这里我将简化模拟数据集,以便更容易理解问题。
我有:
rm(list = ls())
variable <- rep(c('var1', 'var1_2', 'var1_3', 'var1_4'), 5)
group <- as.factor(rep(c('county1', 'county2', 'county3', 'county4'), 5))
year <- rep(c(2000:2004), 4)
month <- c(rep(1:12, 1), 1:8)
value1 <- sample(1:10000, 20)
value2 <- sample(1:10000, 20)
value3 <- sample(1:10000, 20)
mydata <- data.frame(variable, group, year, month, value1, value2, value3)
head(mydata)
variable group year month value1 value2 value3
1 var1 county1 2000 1 4848 4759 6029
2 var1_2 county2 2001 2 7624 3486 6745
3 var1_3 county3 2002 3 4612 9155 4266
4 var1_4 county4 2003 4 1496 2420 9451
5 var1 county1 2004 5 6739 4312 5577
6 var1_2 county2 2000 6 5127 5030 5479
我想要的是得到另一个 data.frame,其中值不会跨县、跨年或跨月混乱,但每一列将代表变量列中的一个变量。澄清一下,在同一个例子中,我正在寻找最快的方法来获得这个:
var1 <- c(t(mydata[1, 5:7]))
var1_2 <- c(t(mydata[2, 5:7]))
var1_3 <- c(t(mydata[3, 5:7]))
var1_4 <- c(t(mydata[4, 5:7]))
group2 <- rep('county1', 3)
year2 <- rep(2000, 3)
month2 <- rep(1, 3)
mydata2 <- data.frame(group2, year2, month2, var1, var1_2, var1_3, var1_4)
head(mydata2)
group2 year2 month2 var1 var1_2 var1_3 var1_4
county1 2000 1 4848 7624 4612 1496
county1 2000 1 4759 3486 9155 2420
county1 2000 1 6029 6745 4266 9451
写入 county1、2000 年和 1 月的所有值后,我希望它转到 2000 年和 county1 的第 2 个月,而不是第 3 个月等。完成所有月份后,我想要 county 1 的 2001 年等等,最后搬到county2。
我用 melt(), dcast(), stack(), unstack(), gather() and spread()
尝试了各种方法,但都没有成功。
我做到了,虽然不是很优雅。我只是将原来的 data.frame 分成新的 data.frame,选择前 4 个变量,而不是交替需要转换的以下变量。像这样:
res <- select(mydata, c(1:4, 5)) # i changed this 5 to 6, than to 7 etc.
base <- dcast(res, group + year + month ~ variable, value.var = 'value1')
在对每一列执行此操作后,我使用 cbind 创建了一个新的转换数据框:
cbind(base, var1_2[ , 5:14], var1_3[ , 6:14])
它有效,但我仍然希望看到一种更好的方法来在一两行中自动执行此操作。
我有一个包含 41040 个观测值的大型数据框。和 20 个变量。 在这里我将简化模拟数据集,以便更容易理解问题。
我有:
rm(list = ls())
variable <- rep(c('var1', 'var1_2', 'var1_3', 'var1_4'), 5)
group <- as.factor(rep(c('county1', 'county2', 'county3', 'county4'), 5))
year <- rep(c(2000:2004), 4)
month <- c(rep(1:12, 1), 1:8)
value1 <- sample(1:10000, 20)
value2 <- sample(1:10000, 20)
value3 <- sample(1:10000, 20)
mydata <- data.frame(variable, group, year, month, value1, value2, value3)
head(mydata)
variable group year month value1 value2 value3
1 var1 county1 2000 1 4848 4759 6029
2 var1_2 county2 2001 2 7624 3486 6745
3 var1_3 county3 2002 3 4612 9155 4266
4 var1_4 county4 2003 4 1496 2420 9451
5 var1 county1 2004 5 6739 4312 5577
6 var1_2 county2 2000 6 5127 5030 5479
我想要的是得到另一个 data.frame,其中值不会跨县、跨年或跨月混乱,但每一列将代表变量列中的一个变量。澄清一下,在同一个例子中,我正在寻找最快的方法来获得这个:
var1 <- c(t(mydata[1, 5:7]))
var1_2 <- c(t(mydata[2, 5:7]))
var1_3 <- c(t(mydata[3, 5:7]))
var1_4 <- c(t(mydata[4, 5:7]))
group2 <- rep('county1', 3)
year2 <- rep(2000, 3)
month2 <- rep(1, 3)
mydata2 <- data.frame(group2, year2, month2, var1, var1_2, var1_3, var1_4)
head(mydata2)
group2 year2 month2 var1 var1_2 var1_3 var1_4
county1 2000 1 4848 7624 4612 1496
county1 2000 1 4759 3486 9155 2420
county1 2000 1 6029 6745 4266 9451
写入 county1、2000 年和 1 月的所有值后,我希望它转到 2000 年和 county1 的第 2 个月,而不是第 3 个月等。完成所有月份后,我想要 county 1 的 2001 年等等,最后搬到county2。
我用 melt(), dcast(), stack(), unstack(), gather() and spread()
尝试了各种方法,但都没有成功。
我做到了,虽然不是很优雅。我只是将原来的 data.frame 分成新的 data.frame,选择前 4 个变量,而不是交替需要转换的以下变量。像这样:
res <- select(mydata, c(1:4, 5)) # i changed this 5 to 6, than to 7 etc.
base <- dcast(res, group + year + month ~ variable, value.var = 'value1')
在对每一列执行此操作后,我使用 cbind 创建了一个新的转换数据框:
cbind(base, var1_2[ , 5:14], var1_3[ , 6:14])
它有效,但我仍然希望看到一种更好的方法来在一两行中自动执行此操作。