Как "размотать" данные с изменением r
У меня есть кадр данных, который я расплавил, используя пакет reshape, который я хотел бы "не расплавить".
вот пример игрушечных данных (реальный кадр данных равен 500x100 или больше):
variable<-c(rep("X1",3),rep("X2",3),rep("X3",3))
value<-c(rep(rnorm(1,.5,.2),3),rep(rnorm(1,.5,.2),3),rep(rnorm(1,.5,.2),3))
dat <-data.frame(variable,value)
dat
variable value
1 X1 0.5285376
2 X1 0.5285376
3 X1 0.5285376
4 X2 0.1694908
5 X2 0.1694908
6 X2 0.1694908
7 X3 0.7446906
8 X3 0.7446906
9 X3 0.7446906
Каждая переменная (X1, X2, X3) имеет значения, оцененные в 3 разных раза (которые в этом примере игрушек оказываются одинаковыми, но это никогда не бывает).
Я хотел бы получить его (назад) в форме:
X1 X2 X3
1 0.5285376 0.1694908 0.7446906
2 0.5285376 0.1694908 0.7446906
3 0.5285376 0.1694908 0.7446906
В принципе, я бы хотел, чтобы столбец переменной сортировался по идентификатору (X1, X2 и т.д.) и стал заголовком столбца. Я пробовал различные перестановки в cast, dcast, recast и т.д. И не могу получить данные в том формате, который я хочу. Достаточно легко "расплавить" данные от широкой формы до более длинной формы (например, dat datset), но получить ее обратно сложно. Есть идеи? Я знаю, что это относительно просто, но мне сложно понять, как это сделать в изменении или изменении формы2.
Спасибо,
LP
Ответы
Ответ 1
Обычно я делаю это, создавая столбец идентификаторов, а затем используя dcast
:
> dat
variable value
1 X1 0.4299397
2 X1 0.4299397
3 X1 0.4299397
4 X2 0.2531551
5 X2 0.2531551
6 X2 0.2531551
7 X3 0.3972119
8 X3 0.3972119
9 X3 0.3972119
> dat$id <- rep(1:3,times = 3)
> dcast(data = dat,formula = id~variable,fun.aggregate = sum,value.var = "value")
id X1 X2 X3
1 1 0.4299397 0.2531551 0.3972119
2 2 0.4299397 0.2531551 0.3972119
3 3 0.4299397 0.2531551 0.3972119
Ответ 2
В зависимости от того, насколько это необходимо, это будет правильно задано для различного количества вхождений переменных (и в любом порядке).
> variable<-c(rep("X1",5),rep("X2",4),rep("X3",3))
> value<-c(rep(rnorm(1,.5,.2),5),rep(rnorm(1,.5,.2),4),rep(rnorm(1,.5,.2),3))
> dat <-data.frame(variable,value)
> dat <- dat[order(rnorm(nrow(dat))),]
> dat
variable value
11 X3 1.0294454
8 X2 0.6147509
2 X1 0.3537012
7 X2 0.6147509
9 X2 0.6147509
5 X1 0.3537012
4 X1 0.3537012
12 X3 1.0294454
3 X1 0.3537012
1 X1 0.3537012
10 X3 1.0294454
6 X2 0.6147509
> dat$id = numeric(nrow(dat))
> for (i in 1:nrow(dat)){
+ dat_temp <- dat[1:i,]
+ dat[i,]$id <- nrow(dat_temp[dat_temp$variable == dat[i,]$variable,])
+ }
> cast(dat, id~variable, value = 'value')
id X1 X2 X3
1 1 0.3537012 0.6147509 1.029445
2 2 0.3537012 0.6147509 1.029445
3 3 0.3537012 0.6147509 1.029445
4 4 0.3537012 0.6147509 NA
5 5 0.3537012 NA NA