0

我试图使用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)我如何拆分和摆动v3v4向上作为列名使用tidyr
  • 2)在我的真实数据中,我不知道(或者它们很多)变量名称,但它们具有结构“var value”,我想使用一些正则表达式来自动识别和摆动它们,如 1)

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

更新:我的输出将类似于(v2可以跳过,因为它现在与v3and冗余v4):

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

1 回答 1

2

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

这里使用“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

或者,使用cSplit我的“splitstackshape”包(目前不适用于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
于 2015-03-18T12:10:10.107 回答