在R:tidyr中使用正则表达式将值拆分并转换为列名

时间:2015-03-18 11:26:29

标签: regex r tidyr

我试图使用tidyr包进行自定义,并且遇到了一个变量的问题,这个变量是几个变量的连接。在下面的最小示例中,我想将变量v2拆分为其成分变量v3v4,然后摆动这些变量,以便最终得到四个变量v1 - v4

require(plyr)
require(dplyr)
require(stringr)
require(tidyr)    
data <- 
      data.frame(
        v1=c(1,2),
        v2=c("v3 cheese; v4 200", "v3 ham; v4 150")) %>%
      tbl_df()

如果我将v2拆分为新的temp,我只会v3

mutate(data, 
      temp=unlist(sapply(str_split(data$v2, pattern=";"), "[", 1)))

  v1                v2      temp
1  1 v3 cheese; v4 200 v3 cheese
2  2    v3 ham; v4 150    v3 ham

我的问题是:

  • 1)如何使用v3v4tidyr作为列名进行拆分和摆动?
  • 2)在我的真实数据中,我不知道(或者他们很多) 变量名,但它们具有结构&#34; var value&#34;和I 想用一些正则表达式来自动识别和摆动 他们在1)

受到this SO答案的启发,但是使用变量名的正则表达式代码无法使其工作。

更新: 我的输出类似于(v2可以跳过,因为它现在多余为v3v4):

    v1  v2  v3  v4
1   1   v3 cheese; v4 200   cheese  200
2   2   v3 ham; v4 150  ham 150

1 个答案:

答案 0 :(得分:2)

按&#34 ;;&#34;拆分数据,将拆分输出转换为长格式,再按&#34;拆分数据。 &#34; (但这次是一种广泛的形式)并将价值观扩展到你想要的广泛形式。

这里正在使用&#34; dplyr&#34; +&#34; tidyr&#34; +&#34; stringi&#34;:

library(dplyr)
library(tidyr)
library(stringi)

data %>%
  mutate(v2 = stri_split_fixed(as.character(v2), ";")) %>%
  unnest(v2) %>%
  mutate(v2 = stri_trim_both(v2)) %>%
  separate(v2, into = c("var", "val")) %>%
  spread(var, val)
# Source: local data frame [2 x 3]
# 
#   v1     v3  v4
# 1  1 cheese 200
# 2  2    ham 150

或者,使用我的&#34; splitstackshape&#34;中的cSplit包(目前不适用于tbl_df s)

library(dplyr)
library(tidyr)
library(splitstackshape)

as.data.frame(data) %>%
  cSplit("v2", ";", "long") %>%
  cSplit("v2", " ") %>%
  spread(v2_1, v2_2) 
#    v1     v3  v4
# 1:  1 cheese 200
# 2:  2    ham 150