【问题标题】:Separate On first period R在第一个周期 R 上分开
【发布时间】:2020-02-05 03:10:10
【问题描述】:

我有一个数据框,我希望通过第一个“.”将一列 (var) 分成两列。 var 中的值当前有 2 个句点。我想将新名称命名为“First”和“Second。我已经添加了我的数据框以及它的屏幕截图。最后我展示了我的尝试。

df = structure(list(Date.Dates = c("42370", "42373", "42374", "42375", 
"42376", "42377"), var = c("SHOP US Equity.30DAY_IMPVOL_100.0%MNY_DF", 
"SHOP US Equity.30DAY_IMPVOL_100.0%MNY_DF", "SHOP US Equity.30DAY_IMPVOL_100.0%MNY_DF", 
"SHOP US Equity.30DAY_IMPVOL_100.0%MNY_DF", "SHOP US Equity.30DAY_IMPVOL_100.0%MNY_DF", 
"SHOP US Equity.30DAY_IMPVOL_100.0%MNY_DF"), val = c("59.835999999999999", 
"67.208600000000004", "61.522599999999997", "63.298900000000003", 
"66.243200000000002", "69.282899999999998")), row.names = c(NA, 
-6L), class = c("tbl_df", "tbl", "data.frame"))


library(tidyverse)
df %>%
      gather(var, val, -Date.Dates) %>%
      separate(var, c("First", "Second", sep = "/^([^.]+)/")) 

我们应该有一个名为“First”的新列,其中包含值“SHOP US Equity”。第二列名为“Second”,包含值“30DAY_IMPVOL...”

谢谢

【问题讨论】:

  • 你真的需要gather 步骤。它正在创建一个包含“字符/数字”混合的列

标签: r dplyr tidyverse


【解决方案1】:

我们可以使用extract从字符串的开头(^)捕获不是.([^.]+)的字符作为一个组,然后是.(\\.) ) 以及“第二”列的第二组中的其余字符

library(dplyr)
library(tidyr)
df %>%
    extract(var, into = c("First", "Second"), "^([^.]+)\\.(.*)")

或者只使用[.] 作为sep。由于有多个.,它将分成两列并发出警告,这将在第一次出现.时拆分

df %>% 
     separate(var, into = c("First", "Second"), "[.]")
# A tibble: 6 x 4
#  Date.Dates First          Second           val               
#  <chr>      <chr>          <chr>            <chr>             
#1 42370      SHOP US Equity 30DAY_IMPVOL_100 59.835999999999999
#2 42373      SHOP US Equity 30DAY_IMPVOL_100 67.208600000000004
#3 42374      SHOP US Equity 30DAY_IMPVOL_100 61.522599999999997
#4 42375      SHOP US Equity 30DAY_IMPVOL_100 63.298900000000003
#5 42376      SHOP US Equity 30DAY_IMPVOL_100 66.243200000000002
#6 42377      SHOP US Equity 30DAY_IMPVOL_100 69.282899999999998

如果我们不需要警告,另一种选择是使用正则表达式环视

df %>%
   separate(var, into = c("First", "Second"), "(?<=[a-z])\\.(?=[0-9])")

或使用base R

df[c("First", "Second")] <- read.csv(text = sub("\\.", ",", df$var), header = FALSE)

【讨论】:

    【解决方案2】:

    我们可以使用stringr 中的str_split/str_split_fixed,我们可以在其中指定要拆分字符串的多少部分(n)。由于这里我们只需要 2 列,因此可以指定 n = 2。

    stringr::str_split_fixed(df$var, "\\.", 2) %>%
            as.data.frame() %>%
           setNames(c('First', 'Second'))
    
    #           First                    Second
    #1 SHOP US Equity 30DAY_IMPVOL_100.0%MNY_DF
    #2 SHOP US Equity 30DAY_IMPVOL_100.0%MNY_DF
    #3 SHOP US Equity 30DAY_IMPVOL_100.0%MNY_DF
    #4 SHOP US Equity 30DAY_IMPVOL_100.0%MNY_DF
    #5 SHOP US Equity 30DAY_IMPVOL_100.0%MNY_DF
    #6 SHOP US Equity 30DAY_IMPVOL_100.0%MNY_DF
    

    【讨论】:

    • 一如既往,谢谢@Ronak。我从你所有的帖子中学习。但是,已决定使用 akrun answer。
    【解决方案3】:

    如下图需要使用extra参数

    df %>%
      separate(var, c("First","second"), "\\.",extra = "merge")
    # A tibble: 6 x 4
      Date.Dates First          second                    val               
      <chr>      <chr>          <chr>                     <chr>             
    1 42370      SHOP US Equity 30DAY_IMPVOL_100.0%MNY_DF 59.835999999999999
    2 42373      SHOP US Equity 30DAY_IMPVOL_100.0%MNY_DF 67.208600000000004
    3 42374      SHOP US Equity 30DAY_IMPVOL_100.0%MNY_DF 61.522599999999997
    4 42375      SHOP US Equity 30DAY_IMPVOL_100.0%MNY_DF 63.298900000000003
    5 42376      SHOP US Equity 30DAY_IMPVOL_100.0%MNY_DF 66.243200000000002
    6 42377      SHOP US Equity 30DAY_IMPVOL_100.0%MNY_DF 69.282899999999998
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-21
      • 1970-01-01
      • 2020-12-10
      • 1970-01-01
      • 2018-07-25
      • 1970-01-01
      相关资源
      最近更新 更多