Отдельный на первый период R - PullRequest
1 голос
/ 05 февраля 2020

У меня есть фрейм данных, в котором я хочу разделить столбец (var) на 2 столбца первым ".". В настоящее время значения в var имеют 2 периода. Я хотел бы назвать новые имена «Первый» и «Второй». Я добавил свой фрейм данных, а также снимок экрана. В конце я показываю свою попытку.

enter image description here

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 = "/^([^.]+)/")) 

У нас должен быть новый столбец с именем «Первый», в котором содержится значение «ПОКУПАТЬ капитал США». Второй столбец с именем «Второй» содержит значение «30DAY_IMPVOL ...»

Спасибо

Ответы [ 3 ]

2 голосов
/ 05 февраля 2020

Мы можем использовать str_split / str_split_fixed из stringr, где мы можем указать, на сколько частей мы хотим разбить строку (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
2 голосов
/ 05 февраля 2020

Мы можем использовать 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)
1 голос
/ 05 февраля 2020

Вам необходимо использовать параметр 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
...