每两个字符多次拆分字符串
Split character string multiple times every two characters
我的数据框中有一个字符列看起来像
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 的字符串。
你们其实很亲密。您需要将 separator-positions 指定为 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
在 base 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
我们可以用 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)
我的数据框中有一个字符列看起来像
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 的字符串。
你们其实很亲密。您需要将 separator-positions 指定为 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
在 base 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
我们可以用 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)