【问题标题】:Split an string by number of characters in a column of a data frame to create multiple columns in R?按数据框列中的字符数拆分字符串以在 R 中创建多列?
【发布时间】:2017-06-12 02:37:07
【问题描述】:

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 分成两列。例如,我想在df 中添加两列(Spl_1Spl_2),其中Spl_1 具有ID 列的前四个字符 和@ 987654336@ 具有ID 字符的其余部分(ie 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 & Q2。虽然信息量很大,但我仍然不知道如何按字符数分割刺痛。我找到了'stringr'包,我使用str_sub命令学习,我可以按数字拆分。见下文:

 library(stringr)
ID <- "0334KLM001"
str_sub(ID, c(1,5), c(4,10))
[1] "0334"   "KLM001"

但我不知道如何与其他r 命令组合以获取上面提供的output

【问题讨论】:

  • df$spl_1 &lt;- substr(df$ID, 1, 4); df$spl_2 &lt;- substr(df$ID, 5, 10) 应该这样做。

标签: r string dataframe split text-processing


【解决方案1】:

我们可以使用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)

【讨论】:

  • 为了我的好奇心,如果我想要三列怎么办。例如 Spl_1 (1:4) , Spl_2 (5:8) , Spl_3 (9:10) 。就像 0334KLM001 它会是 0334 , KLM0 , 01 ?
  • @Daniel 您可以使用extract,即extract(df, ID, into = c("Spl_1", "Sp1_2", "Sp1_3"), "(.{4})(.{4})(.*)")separate(df, ID, into = c("Spl_1", "Spl_2", "Spl_3"), sep = c(4,8), remove = FALSE)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-05-20
  • 2023-03-12
  • 2018-10-29
相关资源
最近更新 更多