【问题标题】:Extract string from a cell and put it in a new data frame R从单元格中提取字符串并将其放入新的数据框 R
【发布时间】:2017-05-08 16:32:46
【问题描述】:

在 R 项目中,我想从数据框中提取字符串,其中列类似于

"A|B|C"
"B|Z"
"I|P"
...

我想要一个带有A B C Z I P 列的新数据框 我想用 for 和 gsub 来实现,但这并不容易,因为模式提取了 |,我不确定这是否是完成此类任务的最佳和优雅的方式

【问题讨论】:

    标签: r regex extract


    【解决方案1】:

    从数据帧 df 开始,使用基础 R,我们可以尝试以下操作:

    data.frame(col=unique(unlist(strsplit(as.character(df$col), split='\\|'))))
    #  col
    #1   A
    #2   B
    #3   C
    #4   Z
    #5   I
    #6   P
    

    或使用 dplyr

    df %>% 
      mutate(col = strsplit(col, "\\|")) %>% 
      unnest(col) %>% unique 
    
    #     col
    #   (chr)
    #1     A
    #2     B
    #3     C
    #4     Z
    #5     I
    #6     P
    

    数据

    df <- data.frame(col=c("A|B|C",
                           "B|Z",
                           "I|P"), stringsAsFactors = FALSE)
    

    如果您希望它们成为列的名称,请尝试以下操作:

    symbols <- unique(unlist(strsplit(as.character(df$col), split='\\|')))
    df <- data.frame(matrix(vector(), 0, length(symbols),
                      dimnames=list(c(), symbols)), stringsAsFactors=F)
    df
    #[1] A B C Z I P
    #<0 rows> (or 0-length row.names)
    

    【讨论】:

    • 谢谢,现在的问题是使列的 A、B、C 名称而不是列中的行
    【解决方案2】:

    带有文本参数输入的scan 函数似乎适合此任务:

     st <- c("A|B|C","B|Z","I|P")
     scan(text=st, what="", sep="|")
    Read 7 items
    [1] "A" "B" "C" "B" "Z" "I" "P"
    

    从您的问题描述或示例中,我不清楚您希望如何将其与原始 3 行数据框对齐。

    【讨论】:

    • 当我扫描时(text = st[i,3], what = "", sep = "|") 我得到“参数'文本'不正确”;其中“i”是行数(有很多),3 是字母所在的列。
    • @Chènevis 也许你的文字是一个因素而不是字符
    【解决方案3】:

    我们可以使用cSplit

    library(splitstackshape)
    unique(cSplit(df1, "V1", "|", "long"), by = "V1")
    

    数据

    df1 <- data.frame(V1 =  c("A|B|C","B|Z","I|P"))
    

    【讨论】:

      【解决方案4】:

      结合 strsplit,unlistunique 你可以:

      #Steps:
      #1) split each element of column with separator as "|"
      #2) combine output for all items with unlist
      #3) retain unique elements of those
      
      
      vec = c("A|B|C","B|Z","I|P")
      
      newDF = data.frame(newCol = unique(unlist(lapply(vec,function(x) unlist(strsplit(x,"[|]")) ))),
      stringsAsFactors = FALSE)
      
      newDF$newCol
      #[1] "A" "B" "C" "Z" "I" "P"
      

      【讨论】:

      • unique(scan(textConnection(vec), 'character', sep = '|'))
      • data.frame(char = unique(unlist(strsplit(vec, "|", fixed = TRUE))))
      猜你喜欢
      • 2019-01-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-01
      相关资源
      最近更新 更多