晚上好
我现在有一个看起来像这样的数据框:
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填充值?这将非常有用,因为我具有三个级别的前缀(观察,日,周)。
非常感谢!
答案 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