如何在R中扩展或传递多个值

13

这是用于本例的玩具数据集:

data <- data.frame(x=rep(c("red","blue","green"),each=4), y=rep(letters[1:4],3), value.1 = 1:12, value.2 = 13:24)

       x y value.1 value.2
1    red a       1      13
2    red b       2      14
3    red c       3      15
4    red d       4      16
5   blue a       5      17
6   blue b       6      18
7   blue c       7      19
8   blue d       8      20
9  green a       9      21
10 green b      10      22
11 green c      11      23
12 green d      12      24

我如何将变量 y 转换为以下宽数据框:

     x a.value.1 b.value.1 c.value.1 d.value.1 a.value.2 b.value.2 c.value.2 d.value.2
1  blue         5         6         7         8        17        18        19        20
2 green         9        10        11        12        21        22        23        24
3   red         1         2         3         4        13        14        15        16

如果真实数据有更多的变量,为什么你想要它呈现在宽格式中?在长格式中更易于阅读。 - Rich Scriven
1
@RichardScriven,在基因组学中,例如一些下游分析需要宽格式的数据。 - Arun
2个回答

16

我们可以使用 dplyr/tidyr 来完成这个任务。使用 gather 函数将 'data' 数据从 'wide' 格式转换为 'long' 格式,并指定要合并到一个键值列对中的列(starts_with('value')),创建一个 'Var/Val' 键值列对,使用 unite 函数将 'Var' 列和 'y' 列合并成一个新的 'Var1' 列,最后使用 spread 函数将数据重新转换为 'wide' 格式。

 library(dplyr)
 library(tidyr)
 data %>%
      gather(Var, val, starts_with("value")) %>% 
      unite(Var1,Var, y) %>% 
      spread(Var1, val)

 #      x value.1_a value.1_b value.1_c value.1_d value.2_a value.2_b   value.2_c
 #1   blue         5         6         7         8        17        18        19
 #2  green         9        10        11        12        21        22        23
 #3    red         1         2         3         4        13        14        15
 #    value.2_d
 #1        20
 #2        24
 #3        16

更新

(六个月之后)

data.table_1.9.5开始,使用 dcast 将多个值列重塑为宽格式不再需要使用 melt。我们可以从这里安装开发版本。

 library(data.table)
 dcast(setDT(data), x~y, value.var=c('value.1', 'value.2'))
 #       x a_value.1 b_value.1 c_value.1 d_value.1 a_value.2 b_value.2 c_value.2
 #1:  blue         5         6         7         8        17        18        19
 #2: green         9        10        11        12        21        22        23
 #3:   red         1         2         3         4        13        14        15
 #   d_value.2
 #1:        20
 #2:        24
 #3:        16

嗨,我正在尝试根据您的更新建议进行操作,但出现了错误:“Error in .subset2(x,I,exact=exact): subscript out of bounds” 请帮忙解决? - garson
@ garson 你是否正在使用data.table的开发版本?我使用你提供的示例没有遇到任何错误。 - akrun
我不确定...你能告诉我如何安装吗?抱歉打扰了。 - garson
2
@garson 安装说明在这里 - akrun

6

首先使用melt函数,然后再使用dcast函数:

library(reshape2)
data1 <- melt(data, id.vars = c("x", "y"))
dcast(data1, x ~ variable + y)
#      x value.1_a value.1_b value.1_c value.1_d value.2_a value.2_b value.2_c value.2_d
#1  blue         5         6         7         8        17        18        19        20
#2 green         9        10        11        12        21        22        23        24
#3   red         1         2         3         4        13        14        15        16

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接