【问题标题】:split strings into two columns将字符串分成两列
【发布时间】:2017-12-04 17:22:44
【问题描述】:

我正在处理其他人的数据,其列的可能值为“短”和“长”。不幸的是,数据创建者还在这些词之后添加了字母和问号来注释某些东西,我想将它们分成单独的列。以下是一些可以使用的假数据:

vars <- c('long','short','longG','short?','short?F','long?G')
species <- c('sp1','sp2','sp3','sp4','sp5','sp6')
testdf <- cbind(vars, species)

我想将vars 列拆分为实际值longshort,以及一个仅包含注释字符的新列。我可以通过以下方式到达一半,它正确地生成了一个只有注释字符的新列:

testdf %>% mutate(notes = gsub('long|short',"",vars)

但我不知道如何拆分或子集var,以便我得到一个只显示shortlong 的列。

提前感谢 SO 社区的帮助! ^_^

【问题讨论】:

  • 预期输出是什么?

标签: r regex string


【解决方案1】:

很难在base R 中提取字符串片段。改用stringr

library(stringr)
str_extract(vars, 'long|short')
# [1] "long"  "short" "long"  "short" "short" "long" 

(您可以在mutate 或其他地方使用它。)


所以你的完整示例(我会参数化模式以更好地衡量)

pattern = "long|short"
mutate(testdf,
   notes = gsub(pattern, "", vars),
   notes2 = str_replace(vars, pattern, ""), # stringr alternative for consistent syntax
   ls = str_extract(vars, pattern))

【讨论】:

    【解决方案2】:

    问题中的testdf 是一个矩阵,因此请使用以下两种选择之一将其转换为数据框:

    1) sub 一个 mutate 和两个 sub 调用,具有相同的模式 pat 但替换不同。

    pat <- "(long|short)(.*)"
    testdf %>% 
           as.data.frame %>%
           mutate(notes = sub(pat, "\\2", vars), 
                  vars = sub(pat, "\\1", vars))
    

    给予:

       vars  species notes
    1  long      sp1      
    2 short      sp2      
    3  long      sp3     G
    4 short      sp4     ?
    5 short      sp5    ?F
    6  long      sp6    ?G
    

    2) 分隔 在 long 或 short 后插入分号(或其他字符),然后使用 tidyr 中的 separate。请注意,即使注释包含分号,这也有效,因为它只在第一个分号处拆分。

    library(tidyr)
    
    testdf %>% 
           as.data.frame %>%
           mutate(vars = sub("(long|short)", "\\1;", vars)) %>%
           separate(vars, c("vars", "notes"), sep = ";", extra = "merge")
    

    给予:

       vars notes  species
    1  long            sp1
    2 short            sp2
    3  long     G      sp3
    4 short     ?      sp4
    5 short    ?F      sp5
    6  long    ?G      sp6
    

    请注意,如果总是有 ?将音符分开,则可以简化为:

    testdf %>% 
           as.data.frame %>%
           separate(vars, c("vars", "notes"), sep = "\\?", extra = "merge")
    

    【讨论】:

    • 添加了第二种选择。
    猜你喜欢
    • 2012-07-22
    • 2015-12-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-30
    相关资源
    最近更新 更多