通过匹配dplyr中的列后缀,从宽格式转换为长格式

时间:2019-02-26 21:53:37

标签: r dplyr

假设我有以下数据:

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)

我一直在尝试将spreadseparate与正则表达式匹配器一起使用,但无法使其正常工作。有什么想法吗?

2 个答案:

答案 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)