【问题标题】:Extract characters between semicolons in r提取r中分号之间的字符
【发布时间】:2021-12-30 16:33:19
【问题描述】:

尝试提取分号之间的数据并将该数据放入新列中。

这是一些数据

df <- data.frame(data = c("a;;c;d", "a;b;;d","a;;;d","a;b;;;"), num =c(1:4))

这是我到目前为止从 S.O. 收集到的内容

res <- df %>% 
  mutate(
    colA = str_extract(data, "^[^;]*(?=;)"),
    colB = str_extract(data, "(?<=;)[^;]*(?=;)"),
    colC = str_extract(data, "(?<=;)(?<=;)[^;]*(?=;)"),
    colD = str_extract(data, "(?<=;)[^;]*$")
  ) 

它几乎可以满足我的要求,但 colCcolB 相同。我不太了解正则表达式,因此将不胜感激地收到解决方案和解释。

【问题讨论】:

  • 为什么不strsplit(df$data, ";")
  • 这给了我一个列表,没有 df 中的剩余数据。

标签: r string split


【解决方案1】:

基础 R

cbind(df, read.csv2(text = df$data, header = FALSE))
#     data num V1 V2 V3 V4 V5
# 1 a;;c;d   1  a     c  d NA
# 2 a;b;;d   2  a  b     d NA
# 3  a;;;d   3  a        d NA
# 4 a;b;;;   4  a  b       NA

dplyr

library(dplyr)
df %>%
  mutate(read.csv2(text = data, header = FALSE))
#     data num V1 V2 V3 V4 V5
# 1 a;;c;d   1  a     c  d NA
# 2 a;b;;d   2  a  b     d NA
# 3  a;;;d   3  a        d NA
# 4 a;b;;;   4  a  b       NA

无需显式赋值因为mutate(和summarize)会很高兴地采用命名-list(其中data.frame是一个特殊的——并且兼容的——案例)。

【讨论】:

  • 谢谢,base R 是一种享受。无法使 dplyr 选项正常工作,它返回了起始 df。
  • 我不知道为什么给定示例数据它不起作用,也许是版本问题?为此,我使用的是 R-4.0.5 (win10) 和 dplyr-1.0.5。
【解决方案2】:

除了 r2evans 基础 R 和 dplyr:

data.table

library(data.table)

df <- data.table(data = c("a;;c;d", "a;b;;d","a;;;d","a;b;;;"), num =c(1:4))

df[, c("ColA", "ColB", "ColC", "ColD"):=tstrsplit(data, ";")]

df

     data num ColA ColB ColC ColD
1: a;;c;d   1    a         c    d
2: a;b;;d   2    a    b         d
3:  a;;;d   3    a              d
4: a;b;;;   4    a    b          

【讨论】:

    【解决方案3】:

    另一种解决方案,使用tidyr::separate

    library(tidyverse)
    
    df <- data.frame(data = c("a;;c;d", "a;b;;d","a;;;d","a;b;;;"), num =c(1:4))
    
    df %>% 
      separate(data, into = str_c("col", letters[1:4]), sep=";", extra="drop")
    
    #>   cola colb colc cold num
    #> 1    a         c    d   1
    #> 2    a    b         d   2
    #> 3    a              d   3
    #> 4    a    b             4
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-20
      • 2021-09-01
      • 1970-01-01
      相关资源
      最近更新 更多