2

複数の共変量の繰り返し測定でいくつかのデータを処理しています。サンプルデータのフォーマットはこんな感じ

set.seed(123)
df <- data.frame(id = 1001:1003, matrix(rnorm(36),3,12),
                 d=runif(3), e=runif(3), f=runif(3))
colnames(df) <- c('df', paste('a', 1:4, sep=''), paste('b', 1:4, sep=''),
                  paste('c',1:4,sep=''), 'd', 'e', 'f')
df

  id          a1         a2  a3  a4  b1  b2  b3 b4 c1 c2 c3 c4 d e f
1001  -0.5604756 0.07050839 ......
1002  -0.2301775 0.12928774
1003   1.5587083 1.71506499 ...

次のような各共変量でデータを長い形式に変換したいと思います

  id  time          a          b        c        d       e      f
1001     1 -0.5604756  0.4007715 ..
1001     2 0.07050839
1001     3
1001     4
1002     1
1002     2
1002     3
1002     4
1003     1
1003     2
1003     3
1004     4

どうもありがとう。

4

4 に答える 4

4

tidyr最近リリースされたパッケージを使用した方法を次に示します。サンプルデータを少し変更したことに注意してください。提供したとおりにする必要があります?

サンプルデータ:

set.seed(123)
df = data.frame(id=1001:1003,matrix(rnorm(36),3,12),d=runif(3),e=runif(3),f=runif(3))
colnames(df) = c('df',paste('a',1:4,sep=''),
                      paste('b',1:4,sep=''),
                      paste('c',1:4,sep=''),
                 paste('d',1,sep=''),
                 paste('e',1,sep=''),
                 paste('f',1,sep=''))
df

コード:

library(tidyr)
library(dplyr)

df %>%
  gather(key, value, -df) %>%
  extract(key, c("letter", "number"), "([[:alpha:]])([[:digit:]])" ) %>%
  spread(letter, value)

結果:

 df number           a          b          c            d         e         f
1  1001      1 -0.56047565  0.4007715 -0.6250393 0.7101824014 0.2201189 0.3517979
2  1001      2  0.07050839  1.7869131  0.1533731           NA        NA        NA
3  1001      3  0.46091621  0.7013559  0.4264642           NA        NA        NA
4  1001      4 -0.44566197 -0.2179749  0.8781335           NA        NA        NA
5  1002      1 -0.23017749  0.1106827 -1.6866933 0.0006247733 0.3798165 0.1111354
6  1002      2  0.12928774  0.4978505 -1.1381369           NA        NA        NA
7  1002      3 -1.26506123 -0.4727914 -0.2950715           NA        NA        NA
8  1002      4  1.22408180 -1.0260044  0.8215811           NA        NA        NA
9  1003      1  1.55870831 -0.5558411  0.8377870 0.4753165741 0.6127710 0.2436195
10 1003      2  1.71506499 -1.9666172  1.2538149           NA        NA        NA
11 1003      3 -0.68685285 -1.0678237  0.8951257           NA        NA        NA
12 1003      4  0.35981383 -0.7288912  0.6886403           NA        NA        NA
于 2015-03-15T07:21:59.300 に答える
4

data.tableからv1.9.5+複数の列に溶けることができます。こちらの手順に従ってインストールできます。

require(data.table) # v1.9.5+
melt(setDT(df), measure = patterns(paste0("^", letters[1:6], "[0-9]*$")), 
         value.name=letters[1:6])
#       df variable           a          b          c            d         e         f
#  1: 1001        1 -0.56047565  0.4007715 -0.6250393 0.7101824014 0.2201189 0.3517979
#  2: 1002        1 -0.23017749  0.1106827 -1.6866933 0.0006247733 0.3798165 0.1111354
#  3: 1003        1  1.55870831 -0.5558411  0.8377870 0.4753165741 0.6127710 0.2436195
#  4: 1001        2  0.07050839  1.7869131  0.1533731           NA        NA        NA
#  5: 1002        2  0.12928774  0.4978505 -1.1381369           NA        NA        NA
#  6: 1003        2  1.71506499 -1.9666172  1.2538149           NA        NA        NA
#  7: 1001        3  0.46091621  0.7013559  0.4264642           NA        NA        NA
#  8: 1002        3 -1.26506123 -0.4727914 -0.2950715           NA        NA        NA
#  9: 1003        3 -0.68685285 -1.0678237  0.8951257           NA        NA        NA
# 10: 1001        4 -0.44566197 -0.2179749  0.8781335           NA        NA        NA
# 11: 1002        4  1.22408180 -1.0260044  0.8215811           NA        NA        NA
# 12: 1003        4  0.35981383 -0.7288912  0.6886403           NA        NA        NA
于 2015-03-15T09:56:59.873 に答える