【问题标题】:(R) Parse character vector and split into two separate columns(R) 解析字符向量并分成两个单独的列
【发布时间】:2019-04-22 02:24:38
【问题描述】:

我有一个数据框,其中包含均值 (sd) 的字符列,如下所示:

table <- tribble(
  ~var1, ~var2,
  #------------
  "27.0 (3.1)", "171.4 (9.0)",
  "27.0 (3.2)", "176.8 (7.2)",
  "27.1 (3.0)", "165.0 (6.2)"
)

我想将每一列分成两列,一列用于平均值,另一列用于标准差。比如:

table_split <- tribble(
  ~var1_mean, ~var1_sd, ~var2_mean, ~var2_sd,
  #---------------------
  27.0, 3.1, 171.4, 9.0,
  27.0, 3.2, 176.8, 7.2,
  27.1, 3.0, 165.0, 6.2

)

到目前为止,我已经尝试过tidyr::separate(table, var1, c("var1_mean", "var1_sd"), sep = " \\("),它只是部分起作用,因为它不会删除结尾括号。

【问题讨论】:

  • table %&gt;% separate(var1, c("var1_mean", "var1_sd"), sep = " \\(") %&gt;% mutate(var1_sd = gsub(")", "", var1_sd))?也就是说,只需使用gsub 添加mutate 调用即可删除最终的)

标签: r regex parsing tidyr


【解决方案1】:

使用separate,如下所示。请注意,这需要 tidyr 0.8.2 或更高版本。早期版本不支持 into 参数中的 NA

library(dplyr)
library(tidyr)  

table %>% 
  separate(var1, into = c("mean1", "sd1", NA), sep = "[ ()]+") %>%
  separate(var2, into = c("mean2", "sd2", NA), sep = "[ ()]+")

给予:

# A tibble: 3 x 4
  mean1 sd1   mean2 sd2  
  <chr> <chr> <chr> <chr>
1 27.0  3.1   171.4 9.0  
2 27.0  3.2   176.8 7.2  
3 27.1  3.0   165.0 6.2 

【讨论】:

  • 谢谢——这正是我想要的。如果你不介意,你能解释一下为什么 sep = "[ ()]+" 吗?我试过 sep = "[ ()]" 但没有用。据我了解,正则表达式意味着匹配任一空格,打开或关闭括号一次或多次
  • 两个数字之间有两个字符,所以要么像我们一样添加加号,这样 space-left-paren 被视为单个分隔符,否则它们将被视为两个分隔符,在这种情况下我们必须使用into = c("mean1", NA, "sd1", NA)
【解决方案2】:

在基础 R 中你会这样做:

nms = paste0(c('mean','sd'),rep(1:2,each=ncol(table))) # Create the new names

read.table(text=gsub('[()]','',do.call(paste,table)),col.names = nms)

  mean1 sd1 mean2 sd2
1  27.0 3.1 171.4 9.0
2  27.0 3.2 176.8 7.2
3  27.1 3.0 165.0 6.2

【讨论】:

    猜你喜欢
    • 2022-01-19
    • 1970-01-01
    • 2018-04-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-30
    • 1970-01-01
    相关资源
    最近更新 更多