如何在R中用dplyr将行字符向量拆分为未知数量的列?
在R中拆分未知长度的逗号分隔字符并生成对应列
问题背景
给定以下结构的数据框:
| date | var |
|---|---|
| 2022-01-01 | a,b,c,d,e,h |
| 2022-01-02 | a,b,c,d,e,f,i,z |
需要将var列按逗号拆分,自动生成足够数量的列,长度不足的单元格用NA填充,最终得到类似如下的结果:
| date | var1 | var2 | var3 | var4 | var5 | var6 | var7 | var8 |
|---|---|---|---|---|---|---|---|---|
| 2022-01-01 | a | b | c | d | e | h | NA | NA |
| 2022-01-02 | a | b | c | d | e | f | i | z |
可复现代码:
date = seq(as.Date("2022/1/1"), as.Date("2022/1/2"), by = "day") var = c("a,b,c,d,e,h","a,b,c,d,e,f,i,z") df = tibble(date,var)
解决方案
方法1:使用tidyr::separate_wider_delim(推荐)
这是tidyr包专为未知分隔数量场景设计的函数,自动识别最长拆分长度并生成对应列,不足部分填充NA:
library(tidyverse) df_processed <- df %>% separate_wider_delim(var, delim = ",", names = "var{number}") # 查看结果 print(df_processed)
输出:
# A tibble: 2 × 8 date var1 var2 var3 var4 var5 var6 var7 <date> <chr> <chr> <chr> <chr> <chr> <chr> <chr> 1 2022-01-01 a b c d e h NA 2 2022-01-02 a b c d e f i # ℹ 1 more variable: var8 <chr>
方法2:str_split + unnest_wider
先将字符串拆分为列表,再展开为多列:
df_processed <- df %>% mutate(var = str_split(var, ",")) %>% unnest_wider(var, names_sep = "") %>% rename_with(~paste0("var", stringr::str_remove(.x, "...")), starts_with("...")) print(df_processed)
方法3:separate配合动态列数计算
如果一定要使用dplyr::separate,需先计算最长拆分长度,再指定列名:
# 计算需要的最大列数 max_col_count <- max(stringr::str_count(df$var, ",") + 1) df_processed <- df %>% separate(var, into = paste0("var", 1:max_col_count), sep = ",", fill = "right") print(df_processed)
内容的提问来源于stack exchange,提问作者Homer Jay Simpson
相关产品推荐
相关产品推荐

