按数据框列中的字符数拆分字符串以在 R 中创建多列?
Split an string by number of characters in a column of a data frame to create multiple columns in R?
在r
中有data frame
(df
)如下,它有ID
个10个字符的字符串。
df:
ID Var1 Var2
1 0334KLM001 aa xx
2 1334HDM002 zvv rr
3 2334WEM003 qetr qwe
4 3334OKT004 ff sdf
5 4334WER005 ee sdf
6 5334BBC006 qly ssg
7 6334QQQ007 kk htj
8 7334AAA008 uu yjy
9 8334CBU009 ww wttt
10 9334MLO010 aa dg
意向:
使用 r
命令,我想将 ID
分成两个额外的列,仅按 个字符数 。例如,我想将两列 (Spl_1
& Spl_2
) 添加到 df
其中 Spl_1
具有 前四个字符 列的 ID
和 Spl_2
具有 ID
字符的其余部分( 即 5:10)。
预期的 output
会是这样的:
output:
ID Var1 Var2 Spl_1 Spl_2
1 0334KLM001 aa xx 0334 KLM001
2 1334HDM002 zvv rr 1334 HDM002
3 2334WEM003 qetr qwe 2334 WEM003
4 3334OKT004 ff sdf 3334 OKT004
5 4334WER005 ee sdf 4334 WER005
6 5334BBC006 qly ssg 5334 BBC006
7 6334QQQ007 kk htj 6334 QQQ007
8 7334AAA008 uu yjy 7334 AAA008
9 8334CBU009 ww wttt 8334 CBU009
10 9334MLO010 aa dg 9334 MLO010
我看了下面的问题:Q1 & .Although very informative but still I did not get that how to split the sting by character numbers. I found the ‘stringr' package,我用str_sub
命令学习的,我可以按数字拆分。见下文:
library(stringr)
ID <- "0334KLM001"
str_sub(ID, c(1,5), c(4,10))
[1] "0334" "KLM001"
但我不知道如何结合其他 r
命令来获得上面提供的 output
?
我们可以用separate
library(tidyr)
separate(df, ID, into = c("Spl_1", "Spl_2"), sep = 4, remove = FALSE)
# ID Spl_1 Spl_2 Var1 Var2
#1 0334KLM001 0334 KLM001 aa xx
#2 1334HDM002 1334 HDM002 zvv rr
#3 2334WEM003 2334 WEM003 qetr qwe
#4 3334OKT004 3334 OKT004 ff sdf
#5 4334WER005 4334 WER005 ee sdf
#6 5334BBC006 5334 BBC006 qly ssg
#7 6334QQQ007 6334 QQQ007 kk htj
#8 7334AAA008 7334 AAA008 uu yjy
#9 8334CBU009 8334 CBU009 ww wttt
#10 9334MLO010 9334 MLO010 aa dg
如果我们想要3列,我们可以在sep
中传递一个vector
separate(df, ID, into = c("Spl_1", "Spl_2", "Spl_3"), sep = c(4,8), remove = FALSE)
# ID Spl_1 Spl_2 Spl_3 Var1 Var2
#1 0334KLM001 0334 KLM0 01 aa xx
#2 1334HDM002 1334 HDM0 02 zvv rr
#3 2334WEM003 2334 WEM0 03 qetr qwe
#4 3334OKT004 3334 OKT0 04 ff sdf
#5 4334WER005 4334 WER0 05 ee sdf
#6 5334BBC006 5334 BBC0 06 qly ssg
#7 6334QQQ007 6334 QQQ0 07 kk htj
#8 7334AAA008 7334 AAA0 08 uu yjy
#9 8334CBU009 8334 CBU0 09 ww wttt
#10 9334MLO010 9334 MLO0 10 aa dg
如果开头的数字不定长,就用extract
extract(df, ID, into = c("Spl_1", "Spl_2"), "^([0-9]+)(.*)", remove = FALSE)
对于 3 列,
extract(df, ID, into = c("Spl_1", "Spl_2", "Spl_3"), "(.{4})(.{4})(.*)", remove = FALSE)
在r
中有data frame
(df
)如下,它有ID
个10个字符的字符串。
df:
ID Var1 Var2
1 0334KLM001 aa xx
2 1334HDM002 zvv rr
3 2334WEM003 qetr qwe
4 3334OKT004 ff sdf
5 4334WER005 ee sdf
6 5334BBC006 qly ssg
7 6334QQQ007 kk htj
8 7334AAA008 uu yjy
9 8334CBU009 ww wttt
10 9334MLO010 aa dg
意向:
使用 r
命令,我想将 ID
分成两个额外的列,仅按 个字符数 。例如,我想将两列 (Spl_1
& Spl_2
) 添加到 df
其中 Spl_1
具有 前四个字符 列的 ID
和 Spl_2
具有 ID
字符的其余部分( 即 5:10)。
预期的 output
会是这样的:
output:
ID Var1 Var2 Spl_1 Spl_2
1 0334KLM001 aa xx 0334 KLM001
2 1334HDM002 zvv rr 1334 HDM002
3 2334WEM003 qetr qwe 2334 WEM003
4 3334OKT004 ff sdf 3334 OKT004
5 4334WER005 ee sdf 4334 WER005
6 5334BBC006 qly ssg 5334 BBC006
7 6334QQQ007 kk htj 6334 QQQ007
8 7334AAA008 uu yjy 7334 AAA008
9 8334CBU009 ww wttt 8334 CBU009
10 9334MLO010 aa dg 9334 MLO010
我看了下面的问题:Q1 & str_sub
命令学习的,我可以按数字拆分。见下文:
library(stringr)
ID <- "0334KLM001"
str_sub(ID, c(1,5), c(4,10))
[1] "0334" "KLM001"
但我不知道如何结合其他 r
命令来获得上面提供的 output
?
我们可以用separate
library(tidyr)
separate(df, ID, into = c("Spl_1", "Spl_2"), sep = 4, remove = FALSE)
# ID Spl_1 Spl_2 Var1 Var2
#1 0334KLM001 0334 KLM001 aa xx
#2 1334HDM002 1334 HDM002 zvv rr
#3 2334WEM003 2334 WEM003 qetr qwe
#4 3334OKT004 3334 OKT004 ff sdf
#5 4334WER005 4334 WER005 ee sdf
#6 5334BBC006 5334 BBC006 qly ssg
#7 6334QQQ007 6334 QQQ007 kk htj
#8 7334AAA008 7334 AAA008 uu yjy
#9 8334CBU009 8334 CBU009 ww wttt
#10 9334MLO010 9334 MLO010 aa dg
如果我们想要3列,我们可以在sep
vector
separate(df, ID, into = c("Spl_1", "Spl_2", "Spl_3"), sep = c(4,8), remove = FALSE)
# ID Spl_1 Spl_2 Spl_3 Var1 Var2
#1 0334KLM001 0334 KLM0 01 aa xx
#2 1334HDM002 1334 HDM0 02 zvv rr
#3 2334WEM003 2334 WEM0 03 qetr qwe
#4 3334OKT004 3334 OKT0 04 ff sdf
#5 4334WER005 4334 WER0 05 ee sdf
#6 5334BBC006 5334 BBC0 06 qly ssg
#7 6334QQQ007 6334 QQQ0 07 kk htj
#8 7334AAA008 7334 AAA0 08 uu yjy
#9 8334CBU009 8334 CBU0 09 ww wttt
#10 9334MLO010 9334 MLO0 10 aa dg
如果开头的数字不定长,就用extract
extract(df, ID, into = c("Spl_1", "Spl_2"), "^([0-9]+)(.*)", remove = FALSE)
对于 3 列,
extract(df, ID, into = c("Spl_1", "Spl_2", "Spl_3"), "(.{4})(.{4})(.*)", remove = FALSE)