将一列中的多个值拆分为多行R
splitting multiple values in one column into multiple rows R
我有一个数据框,其中大部分是每行一个观察值。但是,有些行有多个值:
# A tibble: 3 x 2
`number` abilities
<dbl> <chr>
1 51 b1261
2 57 d710
3 57 b1301; d550
structure(list(`number` = c(51, 57, 57), abilities = c("b1261",
"d710", "b1301; d550")), .Names = c("number", "abilities"
), row.names = c(NA, -3L), class = c("tbl_df", "tbl", "data.frame"
))
我想得到以下信息:
# A tibble: 3 x 2
`number` abilities
<dbl> <chr>
1 51 b1261
2 57 d710
3 57 d550
4 57 b1301
在 ; 上拆分很简单但我不确定如何轻松添加新行,尤其是当能力可能包含超过 2 个值时。
这与: 非常相似,但不需要删除重复项
tidyr
中有一个函数 separate_rows
可以做到这一点:
library(tidyr)
## The ";\s+" means that the separator is a ";" followed by one or more spaces
separate_rows(df,abilities,sep=";\s+")
number abilities
<dbl> <chr>
1 51 b1261
2 57 d710
3 57 b1301
4 57 d550
dplyr
对此有好处,因为它有 unnest
:
library(tidyverse)
library(stringr)
df %>%
mutate(unpacked = str_split(abilities, ";")) %>%
unnest %>%
mutate(abilities = str_trim(unpacked))
另一种选择是cSplit
library(splitstackshape)
cSplit(df1, 'abilities', '; ', 'long')
# number abilities
#1: 51 b1261
#2: 57 d710
#3: 57 b1301
#4: 57 d550
我有一个数据框,其中大部分是每行一个观察值。但是,有些行有多个值:
# A tibble: 3 x 2
`number` abilities
<dbl> <chr>
1 51 b1261
2 57 d710
3 57 b1301; d550
structure(list(`number` = c(51, 57, 57), abilities = c("b1261",
"d710", "b1301; d550")), .Names = c("number", "abilities"
), row.names = c(NA, -3L), class = c("tbl_df", "tbl", "data.frame"
))
我想得到以下信息:
# A tibble: 3 x 2
`number` abilities
<dbl> <chr>
1 51 b1261
2 57 d710
3 57 d550
4 57 b1301
在 ; 上拆分很简单但我不确定如何轻松添加新行,尤其是当能力可能包含超过 2 个值时。
这与:
tidyr
中有一个函数 separate_rows
可以做到这一点:
library(tidyr)
## The ";\s+" means that the separator is a ";" followed by one or more spaces
separate_rows(df,abilities,sep=";\s+")
number abilities
<dbl> <chr>
1 51 b1261
2 57 d710
3 57 b1301
4 57 d550
dplyr
对此有好处,因为它有 unnest
:
library(tidyverse)
library(stringr)
df %>%
mutate(unpacked = str_split(abilities, ";")) %>%
unnest %>%
mutate(abilities = str_trim(unpacked))
另一种选择是cSplit
library(splitstackshape)
cSplit(df1, 'abilities', '; ', 'long')
# number abilities
#1: 51 b1261
#2: 57 d710
#3: 57 b1301
#4: 57 d550