转换R数据帧,将前两列保持为标识符

时间:2015-08-17 13:43:47

标签: r dataset transpose

我有一个更大的数据集,但为了这个例子的目的,我做了一个较小的数据集。我的数据集看起来像这样

 df <- data.frame(ID = c(1, 1, 1, 1, 1, 1, 2, 2, 2, 3, 3, 3),
                  APPT_ID = c(11, 11, 11, 12, 12, 12, 13, 13, 13, 14, 14, 14),
                  Variable = c(letters[1:3], letters[1:3], letters[1:3], letters[1:3]),
                  Value = c(41:52))

前两列(ID和APPT_ID)是每个观察的标识符,所以我想将它们保留为列,同时转置后两列(变量和值),使每个变量都是自己的列显示它的价值。我希望ID和APPT_ID的每个唯一组合只有一个观察行。

我希望我的输出数据集看起来像这样:

df2 <- data.frame(ID = c(1, 1, 2, 3), APPT_ID = c(11, 12, 13, 14), 
                  a = c(41, 44, 47, 50), b = c(42, 45, 48, 51),
                  c = c(43, 46, 49, 52) )

最好的原因是什么?

3 个答案:

答案 0 :(得分:2)

我认为这将完成这项工作

library(tidyr)

df %>% 
 spread(Variable, Value)

答案 1 :(得分:1)

在基础R中,您可以使用reshape()

reshape(df,dir='w',idvar=c('ID','APPT_ID'),timevar='Variable');
##    ID APPT_ID Value.a Value.b Value.c
## 1   1      11      41      42      43
## 4   1      12      44      45      46
## 7   2      13      47      48      49
## 10  3      14      50      51      52

您可以使用varying参数来控制生成的变量(非标识符)列的名称。

答案 2 :(得分:0)

使用reshape2

dcast(df, ID+APPT_ID~Variable, value.var="Value")
#   ID APPT_ID  a  b  c
# 1  1      11 41 42 43
# 2  1      12 44 45 46
# 3  2      13 47 48 49
# 4  3      14 50 51 52