首页 > 解决方案 > 使用 dplyr 在 R 中创建多个新的 data.frame 列

问题描述

我有一个看起来像这样的数据框:

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

我想使用某种dplyr家庭功能来制作一个如下所示的数据框:

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, '_'))

但不能完全弄清楚。

标签: rdplyr

解决方案


我们可以使用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

或者在strsplit基于 OP 的代码完成之后,使用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", "_")

推荐阅读