重构复杂的大型数据框架

时间:2017-11-20 14:14:03

标签: dataframe data-manipulation

我有一个41040 obs的大型数据框。和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

在写完县1,2000年和1月的所有值之后,我想要它去第2个月,2000年和县1,而不是第3个月等。完成所有月份之后我想要2001年的县1等,并最终搬到了county2。

我尝试了melt(), dcast(), stack(), unstack(), gather() and spread()的各种方法但没有成功。

1 个答案:

答案 0 :(得分:0)

我做到了,但不是超级优雅。我只是将原始data.frame划分为新的data.frames,选择前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])

虽然我仍然希望看到一种更好的方法,可以在一两行中自动执行此操作。

相关问题