我知道对于每个df <- data.frame(id = 1:2, seq = c('ABCDEFGHI', 'ZABCDJHIA'))
字符(例如this one和this one)拆分字符串有一些答案,但是这些都是针对特定问题的,并且大多与单个字符串有关,并且而不是包含多个字符串的数据帧。
示例数据
id seq
1 1 ABCDEFGHI
2 2 ZABCDJHIA
看起来像这样:
id 1 2 3
1 ABC DEF GHI
2 ZAB CDJ HIA
每三个字符分割一次
我想在每个行字符中的每一行中拆分字符串,以使结果数据帧如下所示:
splitstackshape
我尝试过的事情
我以前使用df %>% cSplit('seq', sep = '', stripWhite = FALSE, type.convert = FALSE)
在单个字符上分割字符串,如下所示:<div class="mdl-textfield mdl-js-textfield mdl-textfield--floating-label">
<input class="mdl-textfield__input" type="text" id="sample3" name="passengername">
<label class="mdl-textfield__label" for="sample3">Passenger Name :</label>
</div>
我很想拥有类似的功能(或者说cSplit可能)在每个字符上分割第三角色。
答案 0 :(得分:3)
选项为separate
library(tidyverse)
df %>%
separate(seq, into = paste0("x", 1:3), sep = c(3, 6))
# id x1 x2 x3
#1 1 ABC DEF GHI
#2 2 ZAB CDJ HIA
如果我们想创建更通用的
n1 <- nchar(as.character(df$seq[1])) - 3
s1 <- seq(3, n1, by = 3)
nm1 <- paste0("x", seq_len(length(s1) +1))
df %>%
separate(seq, into = nm1, sep = s1)
或者使用base R
和strsplit
,通过将正则表达式环顾传递到list
然后rbind
来将3个字符的每个实例的'seq'列分开list
个元素
df[paste0("x", 1:3)] <- do.call(rbind,
strsplit(as.character(df$seq), "(?<=.{3})", perl = TRUE))
注意:最好避免以非标准标签(例如数字)开头的列名。因此,请在名称开头加上“ x”
答案 1 :(得分:1)
您还可以使用read.fwf (读取固定宽度格式文件) 在 base 中将每个x字符分割成一个字符串。需要一个文件或一个connection。
read.fwf(file=textConnection(as.character(df$seq)), widths=c(3,3,3))
V1 V2 V3
1 ABC DEF GHI
2 ZAB CDJ HIA