我试图使用tidyr
包进行自定义,并且遇到了一个变量的问题,这个变量是几个变量的连接。在下面的最小示例中,我想将变量v2
拆分为其成分变量v3
和v4
,然后摆动这些变量,以便最终得到四个变量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
我的问题是:
v3
将v4
和tidyr
作为列名进行拆分和摆动? 受到this SO答案的启发,但是使用变量名的正则表达式代码无法使其工作。
更新:
我的输出类似于(v2
可以跳过,因为它现在多余为v3
和v4
):
v1 v2 v3 v4
1 1 v3 cheese; v4 200 cheese 200
2 2 v3 ham; v4 150 ham 150
答案 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