分开在第一个周期 R

Jor*_*ong 3 r dplyr tidyverse

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

在此处输入图片说明

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 = "/^([^.]+)/")) 
Run Code Online (Sandbox Code Playgroud)

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

谢谢

akr*_*run 6

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

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

或者只是[.]用作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
Run Code Online (Sandbox Code Playgroud)

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

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

或使用 base R

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