【问题标题】:r - separate digits from stringr - 将数字与字符串分开
【发布时间】:2017-04-26 14:11:30
【问题描述】:

在此示例中将digitsletters 分开的最有效方法是什么:

       V1 V2
1 p_men_1  1
2 p_men_2  0
3 p_men_3  1
4 p_wom_1  1
5 p_wom_2  1
6 p_wom_3  0

输出

     V1 V2 V3
1 p_men  1  1
2 p_men  2  0
3 p_men  3  1
4 p_wom  1  1
5 p_wom  2  1
6 p_wom  3  0

我试过了

library(tidyr) 
library(dplyr)

df %>% separate(V1, c('V1', 'V2'), sep = '_')

但是因为'_',它不起作用

  df = rbind(c('p_men_1', 1), 
  c('p_men_2', 0), 
  c('p_men_3', 1), 
  c('p_wom_1', 1), 
  c('p_wom_2', 1), 
  c('p_wom_3', 0))

  df = as.data.frame(df)

【问题讨论】:

标签: r regex


【解决方案1】:

这可以工作:

df %>% 
    extract(V1, c('V1', 'V2'), regex = '(^.+)_(\\d+)')

#      V1 V2 V2
# 1 p_men  1  1
# 2 p_men  2  0
# 3 p_men  3  1
# 4 p_wom  1  1
# 5 p_wom  2  1
# 6 p_wom  3  0

【讨论】:

  • tidyr::extract 函数看起来比strsplit 直观得多。具有 factor.method 的额外优势。
【解决方案2】:

我的策略是拆分最后一个下划线,可以通过形成一个模式来编码,该模式具有一个下划线,后跟一个零长度的预读,要求所有非下划线直到字符值的结尾。

cbind( do.call( rbind, strsplit(as.character(dat$V1), split= '_(?=[^_]+$)', perl=TRUE) ),
       dat['V2'] )
      1 2 V2
1 p_men 1  1
2 p_men 2  0
3 p_men 3  1
4 p_wom 1  1
5 p_wom 2  1
6 p_wom 3  0

不幸的是,这似乎是一个格式错误的数据框,因为尽管被识别为数据框并调用 cbind.data.frame,但它使列名的前导数字格式不正确。

【讨论】:

    猜你喜欢
    • 2018-08-24
    • 1970-01-01
    • 2019-10-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-10
    • 1970-01-01
    • 2013-06-29
    相关资源
    最近更新 更多