【问题标题】:Splitting Column Conditionally in R在 R 中有条件地拆分列
【发布时间】:2017-12-18 19:11:20
【问题描述】:

我的数据框看起来像这样:

Var
H2307
A123
F45fjhsk
category
J30HS

我希望它看起来像这样:

Var       Var_1       Var_2
H2307     H           2307
A123      A           123
F45fjhsk  NA          NA
category  NA          NA
J30HS     J           30HS

我已经尝试过这种变体:

for (i in 1:length(dat$Var)){
   if (nchar(dat$Var) < 7){
     tx <- strsplit(dat$Var[i], split = "(?<=[a-zA-Z])(?=[0-9])", perl = T)
     tx <- t(matrix(tx, nrow=2, ncol=length(tx)/2))
   }
 }

我认为这是接近但仍然不起作用;分裂部分工作得很好。我有“

【问题讨论】:

  • 你的前/后没有任何逻辑,也许你可以解释一下。

标签: r regex strsplit


【解决方案1】:

这是tidyr::extract的一个选项:

library(tidyr)
df <- df %>% 
    extract(Var, into=c("Var_1", "Var_2"), regex="^(?=.{1,7}$)([a-zA-Z]+)([0-9].*)$", remove=FALSE)
df

#       Var Var_1 Var_2
#1    H2307     H  2307
#2     A123     A   123
#3 F45fjhsk  <NA>  <NA>
#4 category  <NA>  <NA>
#5    J30HS     J  30HS

^(?=.{1,7}$)asserts the total number of characters小于等于七; ([a-zA-Z]+) 匹配字符串开头的非数字部分; ([0-9].*) 匹配第一个数字之后的所有内容。

【讨论】:

  • 您能解释一下"^(?=.{1,7}$)" 的用途吗?
  • 当我运行它时,没有错误,但数据框似乎没有改变,这很奇怪
  • 您是否将结果分配回dfextract 不会修改 df 而是返回一个新的。
【解决方案2】:

您的正则表达式似乎排除了第二组中包含字母的可能性

([a-zA-Z])(.+)

通过在第二个集合中使用 (.+),您也可以处理这种情况。

【讨论】:

  • @Chi Pak 根据他的示例集,他想要处理。他当前的正则表达式将排除该行,我建议使用 .+ 而不是 [0-9] 进行更新以包含它
  • 已更新以希望澄清
  • 当我在没有“for”或“if”语句的情况下单独运行 regEx 部分时,似乎可以很好地拆分每个值。然而,由于 Var 列中有一些奇怪的长条目,它有时会进行两到三个拆分,但我希望这些长条目无论如何都是 NA,所以我认为使用“nchar
  • 可能会出现其他一些潜在情况,您可能需要考虑如何正确处理,如下所示:Fish4 TG45Ed
猜你喜欢
  • 2020-02-21
  • 2021-09-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-18
  • 1970-01-01
相关资源
最近更新 更多