在 R 中:tidyr 使用正则表达式将值拆分并摆动到列名中
In R: tidyr split and swing value into column name using regex
我正在尝试使用 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
我的问题是:
- 1) 如何使用
tidyr
将 v3
和 v4
拆分并摆动为列名?
- 2) 在我的真实数据中,我不知道(或者对很多人来说)
变量名,但它们具有 "var value" 结构,而我
想使用一些正则表达式来自动识别和摆动
它们如 1)
受到 SO 答案的启发,但无法使用变量名称的正则表达式代码。
更新:
我的输出类似于(v2
可以跳过,因为它现在与 v3
和 v4
是多余的):
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_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
我正在尝试使用 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
我的问题是:
- 1) 如何使用
tidyr
将v3
和v4
拆分并摆动为列名? - 2) 在我的真实数据中,我不知道(或者对很多人来说) 变量名,但它们具有 "var value" 结构,而我 想使用一些正则表达式来自动识别和摆动 它们如 1)
受到
更新:
我的输出类似于(v2
可以跳过,因为它现在与 v3
和 v4
是多余的):
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_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