【问题标题】:Split character string multiple times every two characters每两个字符多次拆分字符串
【发布时间】:2016-04-14 04:53:21
【问题描述】:

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

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 的字符串。

【问题讨论】:

  • 我没有 tidyr 解决方案 strsplit(c("AaBbCC","AABBCC","AAbbCC"), '(?&lt;=..)', perl = TRUE)

标签: r string dataframe tidyr


【解决方案1】:

其实你们很亲近。您需要将分隔位置指定为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 开始计数。非常感谢。
【解决方案2】:

我们可以通过base 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)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-06-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-16
    • 1970-01-01
    相关资源
    最近更新 更多