0

问题

我想用很少的打字来融化一个有很多列的数据框。

我使用的数据框通常有很多列,其中的 ID 可能是数字、字符或因子。ID 和 MEASURED 列通常不连续。

我该怎么办?

有没有类似的东西melt(mydata, id=c(1:7,9,10,12), measured=c(8,11)

例子

我有一个如下所示的数据框

id1 <- round(abs(rnorm(5)),1)
id2 <- sample(letters,5)
id3 <- sample(letters,5)
id4 <- sample(letters,5)
id5 <- sample(letters,5)
id6 <- round(abs(rnorm(5)),1)
id7 <- sample(letters,5)
m1 <-  round(abs(rnorm(5)),1)
id8 <- sample(letters,5)
id9 <- sample(letters,5)
m2 <-  round(abs(rnorm(5)),1)
id10 <- sample(letters,5)    
mydata <- data.frame(id1,id2,id3,id4,id5,id6,id7,m1,id8,id9,m2,id10)

导致....

  id1 id2 id3 id4 id5 id6 id7  m1 id8 id9  m2 id10
1.5   c   i   r   m 1.8   f 0.1   x   g 0.7    t
0.4   n   o   q   b 0.9   s 0.1   f   x 0.0    m
1.6   b   g   s   i 0.7   i 0.5   d   z 1.3    b
0.6   g   s   j   k 0.3   j 0.8   p   i 0.4    d
0.5   z   e   i   s 0.4   r 0.8   k   y 0.9    a

其中“id”表示我想要作为 ID 的列,“m”表示我想要作为 MEASURED 变量的列。注意:我的专栏实际上并不遵循“id_”或“m_”模式——它们可以是任何东西。

我如何正确并快速地让融化按我的意愿工作?

我宁愿不必写出来

melt(mydata, id = c("id1","id2",etc, etc, etc), measured = c("m1","m2))

如果我所有的 ID 变量都是字符,我知道我可以写

melt(mydata, measured = c("m1","m2))

但是因为我有字符/因子 ID 列,所以我得到了这个(不正确的)输出

x   id2 id3 id4 id5 id7 id8 id9 id10 variable value
1    c   i   r   m   f   x   g    t      id1   1.5
2    n   o   q   b   s   f   x    m      id1   0.4
3    b   g   s   i   i   d   z    b      id1   1.6
4    g   s   j   k   j   p   i    d      id1   0.6
5    z   e   i   s   r   k   y    a      id1   0.5
6    c   i   r   m   f   x   g    t      id6   1.8
7    n   o   q   b   s   f   x    m      id6   0.9
8    b   g   s   i   i   d   z    b      id6   0.7
9    g   s   j   k   j   p   i    d      id6   0.3
10   z   e   i   s   r   k   y    a      id6   0.4
11   c   i   r   m   f   x   g    t       m1   0.1
12   n   o   q   b   s   f   x    m       m1   0.1
13   b   g   s   i   i   d   z    b       m1   0.5
14   g   s   j   k   j   p   i    d       m1   0.8
15   z   e   i   s   r   k   y    a       m1   0.8
16   c   i   r   m   f   x   g    t       m2   0.7
17   n   o   q   b   s   f   x    m       m2   0.0
18   b   g   s   i   i   d   z    b       m2   1.3
19   g   s   j   k   j   p   i    d       m2   0.4
20   z   e   i   s   r   k   y    a       m2   0.9

如果我的数据框 ID 和 MEASURED 列像这样连续

mydata <- data.frame(id1,id2,id3,id4,id5,id6,id7,id8,id9,id10,m1,m2)

那么我可以轻松地使用范围

melt(mydata, id=1:10, measured = 11:12)

但是,如果我的 ID/Measured 列不连续,我该怎么办?

在我在 reshape 上看到的所有文档中,包括 Hadley 的论文/演示文稿,我还没有看到如何轻松地做到这一点。

我确定我在这里遗漏了一些非常简单的东西......

4

2 回答 2

1

好的,我刚刚意识到我可以像这样嵌套我的 c

melt(mydata, id=c(c(1:7),9,10,12)

很抱歉使问题过于复杂:-\

编辑:哇。我以为我尝试了 c(1:7,9,10,12) 并且 R 抱怨。不过我现在试了下就好了。这是一个looooooooong的日子。

于 2011-09-17T09:50:09.637 回答
0

您需要以某些东西为条件,无论是列名中的模式、列的类,还是您之前在代码中填充的某些列表。R 无法神奇地找出哪些列是哪些列。

于 2011-09-17T07:36:01.583 回答