我正在尝试在数据集中拆分一列,该列的代码用“-”分隔。这产生了两个问题。首先,我必须拆分列,但我也想估算由“-”暗示的值。我能够使用以下方法拆分数据:
separate_rows(df, code, sep = "-")
但是我仍然没有找到一种估算隐含值的方法。
name <- c('group1', 'group1','group1','group2', 'group1', 'group1',
'group1')
code <- c('93790', '98960 - 98962', '98966 - 98969', '99078', 'S5950',
'99241 - 99245', '99247')
df <- data.frame( name, code)
我要输出的内容类似于:
group1 93790, 98960, 98961, 98962, 98966, 98967, 98968, 98969, S5950, 99241,
99242, 99243, 99244, 99245, 99247
group2 99078
在此示例中,从“-”中插入和暗示了98961、98967和98968。
关于如何实现此目标的任何想法?
答案 0 :(得分:3)
我们拆分了“代码”后,可以选择用map
循环遍历拆分元素,获得序列(:
,unnest
并通过{{1 }}
paste
或者在library(dplyr)
library(stringr)
library(tidyr)
library(purrr)
df %>%
mutate(code = map(strsplit(as.character(code), " - "), ~ {
x <- as.numeric(.x)
if(length(x) > 1) x[1]:x[2] else x})) %>%
unnest(code) %>%
group_by(name) %>%
summarise(code = str_c(code, collapse=", "))
# A tibble: 2 x 2
# name code
# <fct> <chr>
# 1 group1 93790, 98960, 98961, 98962, 98966, 98967, 98968, 98969
# 2 group2 99078
之前有另一个选择,创建一个行索引,并在执行separate_rows
时将其用于分组
complete
如果存在非数字元素
df %>%
mutate(rn = row_number()) %>%
separate_rows(code, convert = TRUE) %>%
group_by(rn, name) %>%
complete(code = min(code):max(code)) %>%
group_by(name) %>%
summarise(code = str_c(code, collapse =", "))
答案 1 :(得分:2)
lapply(split(as.character(df$code), df$name), function(y) {
unlist(sapply(y, function(x){
if(grepl("-", x)) {
n = as.numeric(unlist(strsplit(x, "-")))
n[1]:n[2]
} else {
as.numeric(x)
}
}, USE.NAMES = FALSE))
})
#$group1
#[1] 93790 98960 98961 98962 98966 98967 98968 98969
#$group2
#[1] 99078