在 R 中:tidyr 使用正则表达式将值拆分并摆动到列名中

In R: tidyr split and swing value into column name using regex

我正在尝试使用 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

我的问题是:

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

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

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

按“;”拆分数据,将拆分输出转换为长格式,再次按“”拆分数据(但这次是宽格式)并将值展开为您想要的宽格式。

这里是用"dplyr" + "tidyr" + "stringi":

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

或者,使用我的 "splitstackshape" 包中的 cSplit(目前不适用于 tbl_dfs)

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