有没有一种方法可以使用R和隐式值拆分R中的列

时间:2019-12-10 16:23:15

标签: r dplyr tidyr

我正在尝试在数据集中拆分一列,该列的代码用“-”分隔。这产生了两个问题。首先,我必须拆分列,但我也想估算由“-”暗示的值。我能够使用以下方法拆分数据:

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。

关于如何实现此目标的任何想法?

2 个答案:

答案 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