Изменение формы данных от длинного к широкому, со временем в новом широком имени переменной - PullRequest
5 голосов
/ 23 июля 2010

У меня есть фрейм данных, который я хотел бы объединить из длинного в широкий формат, но я бы хотел, чтобы время вставлялось в имя переменной в широком формате. Вот пример набора данных с длинным форматом:

id <- as.numeric(rep(1,16))
time <- rep(c(5,10,15,20), 4)
varname <- c(rep("var1",4), rep("var2", 4), rep("var3", 4), rep("var4", 4))
value <- rnorm(16)
tmpdata <- as.data.frame(cbind(id, time, varname, value))

> tmpdata
id time varname              value
1    5    var1  0.713888426169224
1   10    var1   1.71483653545922
1   15    var1  -1.51992072577836
1   20    var1  0.556992407683219
....
4   20    var4   1.03752019932467

Я хотел бы это в широком формате со следующим выводом:

id var1.5 var1.10 var1.15 var1.20 ....
1  0.71   1.71    -1.51   0.55 

(and so on)

Я попытался с помощью функции reshape в базе R безуспешно, и я не был уверен, как это сделать с помощью пакета reshape, так как во всех примерах время указывается как другая переменная в широком формате. Есть идеи?

Ответы [ 4 ]

14 голосов
/ 24 июля 2010

Это тривиально с изменением пакета:

library(reshape)
cast(tmpdata, ... ~ varname + time)
3 голосов
/ 23 июля 2010

Я должен был сделать это в два reshape шага. Заголовки строк могут не соответствовать вашим нуждам, но могут быть легко переименованы.

id <- as.numeric(rep(1, 16))
time <- rep(c(5,10,15,20), 4)
varname <- c(rep("var1",4), rep("var2", 4), rep("var3", 4), rep("var4", 4))
value <- rnorm(16)
tmpdata <- as.data.frame(cbind(id, time, varname, value))

first <- reshape(tmpdata, timevar="time", idvar=c("id", "varname"), direction="wide")
second <- reshape(first, timevar="varname", idvar="id", direction="wide") 

А на выходе:

> tmpdata
   id time varname               value
1   1    5    var1  -0.231227494628982
2   1   10    var1   -1.80887236653438
3   1   15    var1  -0.443229294431553
4   1   20    var1    1.33719337048763
5   1    5    var2   0.673109282347586
6   1   10    var2   -0.42142267953938
7   1   15    var2   0.874367622725874
8   1   20    var2   -1.19917678039462
9   1    5    var3    1.13495606258399
10  1   10    var3 -0.0779385346672042
11  1   15    var3  -0.126775240288037
12  1   20    var3  -0.760739300144526
13  1    5    var4   -1.94626587907069
14  1   10    var4    1.25643195699455
15  1   15    var4   -0.50986941213717
16  1   20    var4   -1.01324846239812
> first
   id varname            value.5            value.10           value.15
1   1    var1 -0.231227494628982   -1.80887236653438 -0.443229294431553
5   1    var2  0.673109282347586   -0.42142267953938  0.874367622725874
9   1    var3   1.13495606258399 -0.0779385346672042 -0.126775240288037
13  1    var4  -1.94626587907069    1.25643195699455  -0.50986941213717
             value.20
1    1.33719337048763
5   -1.19917678039462
9  -0.760739300144526
13  -1.01324846239812
> second
  id       value.5.var1     value.10.var1      value.15.var1    value.20.var1
1  1 -0.231227494628982 -1.80887236653438 -0.443229294431553 1.33719337048763
       value.5.var2     value.10.var2     value.15.var2     value.20.var2
1 0.673109282347586 -0.42142267953938 0.874367622725874 -1.19917678039462
      value.5.var3       value.10.var3      value.15.var3      value.20.var3
1 1.13495606258399 -0.0779385346672042 -0.126775240288037 -0.760739300144526
       value.5.var4    value.10.var4     value.15.var4     value.20.var4
1 -1.94626587907069 1.25643195699455 -0.50986941213717 -1.01324846239812
2 голосов
/ 23 июля 2010

Я отказался от старой команды reshape () 2 года назад (не от Хэдли).Кажется, понять, что проклятие каждый раз было на самом деле сложнее, чем просто делать это «сложным» способом, который гораздо более гибок.

Все ваши данные в вашем примере хорошо отсортированы.Возможно, вам придется сначала отсортировать ваши реальные данные по имени и времени переменной.

(переименовал ваши tmpdata в tmp, сделал числовое значение)

y <- lapply(split(tmp, tmp$id), function(x) x$value)
df <- data.frame(unique(tmp$id,), do.call(rbind,y))
names(df) <- c('id', as.character(tmp$time:tmp$var))
1 голос
/ 23 июля 2010

Почему бы просто не вставить varname и время вместе перед изменением формы?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...