【问题标题】:Create multiple new data.frame columns in R using dplyr [duplicate]使用 dplyr 在 R 中创建多个新的 data.frame 列 [重复]
【发布时间】:2019-12-22 21:51:26
【问题描述】:

我有一个如下所示的数据框:

df <- data.frame(text=c('my_text', 'looks_like_this', 'I_want_to_split_it'))

我想使用某种dplyr family 函数来制作一个如下所示的数据框:

newdf <- data.frame(text=c('my_text', 'looks_like_this', 'I_want_to_split_it'),
                    W1=c('my', 'looks', 'I'),
                    W2=c('text', 'like', 'want'),
                    W3=c(NA, 'this', 'to'),
                    W4=c(NA, NA, 'split'),
                    W5=c(NA, NA, 'it'))

我在想这样的事情:

newdf <- df %>%
  mutate(WX=strplit(text, '_'))

但是想不通。

【问题讨论】:

    标签: r dplyr


    【解决方案1】:

    我们可以使用strsplit,然后在最后做NA填充

    lst1 <- strsplit(as.character(df$text), "_")
    out <- do.call(rbind.data.frame, lapply(lst1, `length<-`, max(lengths(lst1))))
    names(out) <- paste0("W", seq_along(out))
    cbind(df, out)
    

    或者另一个选项是read.table

    cbind(df, read.table(text = as.character(df$text), sep="_", header = FALSE,
          fill = TRUE, col.names = paste0("W", 1:5)))
    

    使用tidyverse,我们可以使用separate

    library(dplyr)
    library(tidyr)
    library(stringr)
    df %>%
          separate(text, into = str_c("W", 1:5), fill = 'right', remove = FALSE)
    #               text    W1   W2   W3    W4   W5
    #1            my_text    my text <NA>  <NA> <NA>
    #2    looks_like_this looks like this  <NA> <NA>
    #3 I_want_to_split_it     I want   to split   it
    

    或者在根据 OP 的代码执行 strsplit 之后,使用 unnest_wider

    df %>%
       mutate(WX = strsplit(as.character(text), "_")) %>% 
       unnest_wider(WX, names_repair = ~c('text', str_c("W", 1:5)))
    

    或者使用cSplit

    library(splitstackshape)
    cSplit(df, "text", "_")
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-11-28
      • 2022-01-17
      • 1970-01-01
      • 2023-01-29
      • 2020-09-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多