r-使用spread()或其他整形函数用多个度量列从长到宽对数据进行整形



我知道这里已经有很多关于这个主题的问题了。但在我看了一些之后,它们都只有一个"度量"栏。我仍然不知道如何使用我的数据。

我的数据如下,X1,X2表示不同的区域。因此,该数据集中的每一列都表示为单个区域收集的所有年龄。

age     X1   X2
age 0   2    2
age 1   2    2 
age 2   2    3
... 

我想将数据重塑为宽格式:

age 0  age 1 age 2
X1    2      2     2 
X2    2      2     3
...

要重新创建数据集,请使用

data <-structure(list(age = c("age 0", "age 1", "age 2", "age 3", "age 4", 
"age 5", "age 6", "age 7", "age 8", "age 9", "age 10", "age 11", 
"age 12"), X1 = c(2, 2, 2, 4, 7, 12, 19, 22, 18, 11, 6, 3, 3), 
X2 = c(2, 2, 3, 4, 8, 14, 21, 24, 20, 12, 7, 4, 3)), row.names = c("0", 
"1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12"
), class = "data.frame")

转置有诀窍:

rownames(data)<- data[,1]
wide <- t(data)[2:3,] 

但我想知道如何使用spread((或其他整形函数。

library(tidyr)
wide <- spread(data, age, X1)
#X2 remains the same, and X1 is not correcty reshaped.
wide <- spread(data, age, X1, X2)
#Error in spread.data.frame(data, age, X1, X2) : object 'X2' not found

下面的三年解决方案。你需要将该区域聚集到一列中才能进行传播。

library(tidyr)
data %>% gather(region,val,-age) %>% spread(age,val)  
#   region age 0 age 1 age 10 age 11 age 12 age 2 age 3 age 4 age 5 age 6 age 7 age 8 age 9
# 1     X1     2     2      6      3      3     2     4     7    12    19    22    18    11
# 2     X2     2     2      7      4      3     3     4     8    14    21    24    20    12

看起来你可以通过转换数据来实现这一点:

t(data)

如果你出于任何原因决定重塑数据,你可以使用重塑包,将数据完全转换为长格式,然后转换为宽格式:

library(reshape2)
dcast(melt(data, measure.vars = c("X1","X2")), variable~age)    

或在基R中仅

> t("rownames<-"(data[, -1], data[, 1]))
age 0 age 1 age 2 age 3 age 4 age 5 age 6 age 7 age 8 age 9 age 10 age 11 age 12
X1     2     2     2     4     7    12    19    22    18    11      6      3      3
X2     2     2     3     4     8    14    21    24    20    12      7      4      3

最新更新