在多列上应用 tidyr::separate

spi*_*006 8 r lapply dataframe tidyr

我想遍历数据框中的列并根据分隔符将它们拆分为 。我正在使用tidyr::separate,它在我一次做一列时有效。

例如:

df<- data.frame(a = c("5312,2020,1212"), b = c("345,982,284"))

df <- separate(data = df, col = "a", 
                         into = paste("a", c("col1", "col2", "col3"), 
                                      sep = "_"), sep = ",")
Run Code Online (Sandbox Code Playgroud)

返回:

  a_col1 a_col2 a_col3           b
1   5312   2020   1212 345,982,284
Run Code Online (Sandbox Code Playgroud)

当我尝试对dfR 的每一列执行相同的操作时返回错误

例如我用这个 for 循环:

for(col in names(df)){
    df <- separate(data = df, col = col, 
into = paste(col, c("col1", "col2", "col3), 
sep = "_"), sep = ",")
    }
Run Code Online (Sandbox Code Playgroud)

我期待得到以下输出:

  a_col1 a_col2 a_col3 b_col1 b_col2 b_col3
1   5312   2020   1212    345    982    284
Run Code Online (Sandbox Code Playgroud)

但是 R 返回此错误:

Error in if (!after) c(values, x) else if (after >= lengx) c(x, values) else c(x[1L:after],  : 
  argument is of length zero
Run Code Online (Sandbox Code Playgroud)

还有另一种方法可以应用于tidyr::separate数据框中的多列吗?

Ric*_*ven 11

您可以将自定义separate_()调用提供给Reduce().

sep <- function(...) {
    dots <- list(...)
    n <- stringr::str_count(dots[[1]][[dots[[2]]]], "\\d+")
    separate_(..., into = sprintf("%s_col%d", dots[[2]], 1:n))
}

df %>% Reduce(f = sep, x = c("a", "b"))
#   a_col_1 a_col_2 a_col_3 b_col_1 b_col_2 b_col_3
# 1    5312    2020    1212     345     982     284
Run Code Online (Sandbox Code Playgroud)

否则,cSplit也会这样做。

splitstackshape::cSplit(df, names(df))
#     a_1  a_2  a_3 b_1 b_2 b_3
# 1: 5312 2020 1212 345 982 284
Run Code Online (Sandbox Code Playgroud)

  • 截至今天,任何 tidyverse 函数是否具有与 splitstackshape::cSplit 相同的功能?例如 `tidyr::cSplitBetter` (3认同)