首页 > 解决方案 > R按位置将字符串列分成两列

问题描述

我有一个与这里讨论的问题非常相似的问题:Split data frame string column into multiple columns 但是,给定以下数据框:

before = data.frame(attr = c(1,30,4,6), type=c('foo_and_bar','foo_and_bar_2'))
  attr          Name
1    1        George
2   30          Mark
3    4         Susan

我需要将“名称”列拆分为 2 个字符的倍数。预期的结果应该是:

  attr          Split1     Split2    Split3
1    1            Ge         or        ge
2   30                       Ma        rk
3    4            S          us        an

老实说,我现在知道如何使用 dplyr 单独的功能来实现这一点。谢谢您的帮助。

标签: rdataframedplyr

解决方案


我们可以使用在字符串extract末尾 ( ) 捕获具有组位置锚点的$组,其中第 2 组和第 3 组中有两个字符,而第 1 组可以灵活

library(stringr)
library(dplyr)
library(tidyr)
df1 %>% 
     extract(Name, into = str_c("Split", 1:3), "(.*?)(..)(..)$")
#   attr Split1 Split2 Split3
#1    1     Ge     or     ge
#2   30            Ma     rk
#3    4      S     us     an

或另一种选择是反转字符串并使用位置,sepseparate

library(stringi)
df1 %>% 
  mutate(Name = stri_reverse(Name)) %>% 
  separate(Name, into = str_c("Split", 3:1), sep=c(2, 4)) %>%
  mutate(across(starts_with("Split"), stri_reverse)) %>%
  select(attr, Split1:Split3)

数据

df1 <- structure(list(attr = c(1L, 30L, 4L), Name = c("George", "Mark", 
"Susan")), class = "data.frame", row.names = c("1", "2", "3"))

推荐阅读