假设我有以下数据:
dat <- read.table(text="pairing feelings_pre feelings_post ingroup_pre ingroup_post
0 22.0 22.6 66.3 67.5
1 22.0 28.5 63.2 64.6", header=T)
我正在尝试将此数据从宽格式转换为长格式,以便可以将前和后乐谱绘制为ggplot中的折线图。因此,我需要一列“ pre”,如果感兴趣的列具有“ _pre”后缀,则将其设置为1;如果该列具有“ _post”后缀,则将其设置为0。
生成的数据框的部分示例如下:
dat <- read.table(text="pairing variable value pre
0 feelings_pre 22.0 1
0 feelings_post 22.6 0
0 ingroup_pre 66.3 1
0 ingrop_post 67.5 0", header=T)
我一直在尝试将spread
和separate
与正则表达式匹配器一起使用,但无法使其正常工作。有什么想法吗?
答案 0 :(得分:2)
尝试:
library(dplyr)
dat %>% filter(pairing == 0) %>%
gather(variable, value, -pairing) %>%
mutate(pre = +(grepl("_pre", variable)))
输出:
pairing variable value pre
1 0 feelings_pre 22.0 1
2 0 feelings_post 22.6 0
3 0 ingroup_pre 66.3 1
4 0 ingroup_post 67.5 0
请注意,这是您要过滤掉0 pairing
(因为您的示例中没有)的原因。
但是,由于您说的是局部的,因此只需将filter
的部分保留下来,并获得pairing
等于1的结果。
答案 1 :(得分:1)
另一种可能的可能性是:
dat %>%
gather(variable, value, -pairing) %>%
mutate(pre = ifelse(sub(".*_", "", variable) == "pre", 1, 0))
pairing variable value pre
1 0 feelings_pre 22.0 1
2 1 feelings_pre 22.0 1
3 0 feelings_post 22.6 0
4 1 feelings_post 28.5 0
5 0 ingroup_pre 66.3 1
6 1 ingroup_pre 63.2 1
7 0 ingroup_post 67.5 0
8 1 ingroup_post 64.6 0
在这种情况下,它将数据从宽转换为长,然后检查键_
之后的部分(即“变量”)是否为“ pre”。如果是这样,它将分配1,否则分配0。
或使用str_detect()
中的stringr
:
dat %>%
gather(variable, value, -pairing) %>%
mutate(pre = str_detect(variable, "_pre") * 1)