每两个字符分割一次字符串

8

我有一个数据框中的字符列,看起来像这样

df<-
  data.frame(a=c("AaBbCC","AABBCC","AAbbCC"))#df
       a
1 AaBbCC
2 AABBCC
3 AAbbCC

我希望将这一列每两个字符分割一次。因此,在这种情况下,我想要获得三列,分别命名为VA,VB,VC。 我尝试过

library(tidyr)
library(dplyr)
df<-
  data.frame(a=c("AaBbCC","AABBCC","AAbbCC"))%>%
  separate(a,c(paste("V",LETTERS[1:3],sep="")),sep=c(2,2))
 VA VB   VC
1 Aa    BbCC
2 AA    BBCC
3 AA    bbCC

但这不是期望的结果。我希望将现在在VC中的结果分成VB(所有字母B)和VC(所有字母C)。如何让R每两个字符分割一次?该列中字符串的长度对于每一行始终相同(在此示例中为6)。我将有长度>10的字符串。

8
我没有一个tidyr的解决办法。但是你可以使用以下代码:strsplit(c("AaBbCC","AABBCC","AAbbCC"), '(?<=..)', perl = TRUE),它能够按照每两个字符进行拆分。 - rawr
2个回答

8

你的想法很接近。你需要将分隔符位置指定为sep = c(2,4)而不是sep = c(2,2)

df <- separate(df, a, c(paste0("V",LETTERS[1:3])), sep = c(2,4))

你将获得:

> df
  VA VB VC
1 Aa Bb CC
2 AA BB CC
3 AA bb CC
在基础R中,你可以这样做(借鉴@rawr的评论):
l <- ave(as.character(df$a), FUN = function(x) strsplit(x, '(?<=..)', perl = TRUE))
df <- data.frame(do.call('rbind', l))

这将会得到:

> df
  X1 X2 X3
1 Aa Bb CC
2 AA BB CC
3 AA bb CC

没想到c(2,4)。我以为它在每次分隔后都从0开始计数。非常感谢。 - user2386786

4
我们可以使用基本R来完成这个任务。
read.csv(text=gsub('(..)(?!$)', '\\1,', df$a, 
    perl=TRUE),col.names=paste0("V", LETTERS[1:3]), header=FALSE)
#  VA VB VC
#1 Aa Bb CC
#2 AA BB CC
#3 AA bb CC

如果我们直接从文件中阅读,另一个选项是read.fwf
read.fwf(file="yourfile.txt", widths=c(2,2,2), skip=1)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接