R中data.frame的部分宽到长格式

时间:2018-07-20 15:37:05

标签: r dataframe

晚上好

我现在有一个看起来像这样的数据框:

ID Day1Var1 Day1Var2 Day2Var1 Day2Var2 
1     1        2        3        4
2     5        6        7        8

,我想将其转换为如下所示的较长格式:

ID    Day   Var1   Var2 
1      1      1      2  
1      2      3      4
2      1      5      6  
2      2      7      8

是否有一种简单的方法还可以使用变量的前缀术语(“ Day1”,“ Day2”)来创建一个名为“ Day”的新变量,并自动用1和2填充值?这将非常有用,因为我具有三个级别的前缀(观察,日,周)。

非常感谢!

3 个答案:

答案 0 :(得分:6)

您可以使用以下代码:

首先,我们以长格式收集数据,拆分列键,以便day和var拆分。我从day1中删除day并将数据散布到正确的形式。不知道分隔符和子字符串是否不能一步完成。

library(tidyr)
library(dplyr)

df1 %>% 
  gather(key, value, -ID) %>% 
  separate(key, into = c("Day", "Var"), sep = 4) %>% 
  mutate(Day = substring(Day, 4, 4)) %>% 
  spread(Var, value)
  ID Day Var1 Var2
1  1   1    1    2
2  1   2    3    4
3  2   1    5    6
4  2   2    7    8

数据:

df1 <- structure(list(ID = 1:2, Day1Var1 = c(1L, 5L), Day1Var2 = c(2L, 
6L), Day2Var1 = c(3L, 7L), Day2Var2 = c(4L, 8L)), class = "data.frame", row.names = c(NA, 
-2L))

答案 1 :(得分:4)

这是melt的一个选项,它需要多个measure

library(data.table)
melt(setDT(df1), measure = patterns("Var1", "Var2"), 
      variable.name = 'Day', value.name = c('Var1', 'Var2'))[order(ID)]
#   ID Day Var1 Var2
#1:  1   1    1    2
#2:  1   2    3    4
#3:  2   1    5    6
#4:  2   2    7    8

数据

df1 <- structure(list(ID = 1:2, Day1Var1 = c(1L, 5L), Day1Var2 = c(2L, 
6L), Day2Var1 = c(3L, 7L), Day2Var2 = c(4L, 8L)), .Names = c("ID", 
"Day1Var1", "Day1Var2", "Day2Var1", "Day2Var2"), class = "data.frame", 
 row.names = c(NA, -2L))

答案 2 :(得分:2)

我们可以水平拆分,更改名称并以“ Day”和id绑定:

Q1                 7               3             2             5               2

Q2                 10               7             0             0               1