Как разделить столбец на две колонки путем извлечения?

#r

#r

Вопрос:

Я хотел бы разделить столбцы на два и извлечь и сохранить только числа в одном столбце.

 df <- data.frame(V1 = c("[1] Strongly disagree", "[2] Somewhat disagree", "[3] Neither", "[4] Somewhat agree", "[5] Strongly agree"))
  
                   V1
 [1] Strongly disagree
 [2] Somewhat disagree
 [3] Neither
 [4] Somewhat agree
 [5] Strongly agree
  

Я попытался использовать separate функцию из tidyr :

tidyr::separate(df, V1, into = c("Value", "Label"), sep = "] ")

 Value   Label
[1      Strongly disagree           
[2      Somewhat disagree           
[3      Neither         
[4      Somewhat agree          
[5      Strongly agree
  

Я мог бы удалить [ с помощью другой функции, но мне было интересно, смогу ли я исправить это за один шаг и интересно, есть ли другая функция, которая выполняет эту работу.

Я пытаюсь получить это в конце

         Label        Value
 Strongly disagree     1
 Somewhat disagree     2
 Neither               3
 Somewhat agree        4
 Strongly agree        5
  

Ответ №1:

Если вам больше нравится base R, вот решение base R.:

 df <- data.frame(V1 = c("[1] Strongly disagree", "[2] Somewhat disagree", "[3] Neither", "[4] Somewhat agree", "[5] Strongly agree"))

df$value = as.numeric(regmatches(df$V1, regexpr(r"(d)", df$V1)))

df$V1 = regmatches(df$V1, regexpr("(?<=] ).*", df$V1, perl=TRUE))
df
#>                  V1 value
#> 1 Strongly disagree     1
#> 2 Somewhat disagree     2
#> 3           Neither     3
#> 4    Somewhat agree     4
#> 5    Strongly agree     5
  

Создано 2020-09-05 пакетом reprex (версия 0.3.0)

regmatches это базовая функция R, которая возвращает сопоставленное значение из вектора, она принимает в качестве входных данных вектор и regexpr объект.

Если для извлечения цифры используется первый регистр ( value столбец) d . Во втором случае (?<=] ).* используется для возврата всего, что соответствует после ] ,

Ответ №2:

Другим способом вы можете попытаться str_extract получить значение и str_remove избавиться от квадратных скобок в столбце label.

 library(dplyr)
library(stringr)
df %>% 
  transmute(value = str_extract(V1, "\d "),
         label = str_remove(V1, "\[.*\]"))
#    value              label
# 1      1  Strongly disagree
# 2      2  Somewhat disagree
# 3      3            Neither
# 4      4     Somewhat agree
# 5      5     Strongly agree
  

Ответ №3:

Попробуйте этот подход:

 library(tidyverse)
#Data
df <- data.frame(V1 = c("[1] Strongly disagree",
                        "[2] Somewhat disagree",
                        "[3] Neither", 
                        "[4] Somewhat agree",
                        "[5] Strongly agree"))
#Mutate
df %>% separate(V1,into = c('V1','V2'),sep = ']') %>%
  mutate(V1=gsub("[[:punct:]]",'',V1))
  

Вывод:

   V1                 V2
1  1  Strongly disagree
2  2  Somewhat disagree
3  3            Neither
4  4     Somewhat agree
5  5     Strongly agree
  

Если вы хотите, чтобы у вас были другие имена, вы можете использовать rename() :

 #Mutate 2
df %>% separate(V1,into = c('V1','V2'),sep = ']') %>%
  mutate(V1=gsub("[[:punct:]]",'',V1)) %>%
  rename(Label=V2,Value=V1) %>% select(c(2,1))
  

Вывод:

                Label Value
1  Strongly disagree     1
2  Somewhat disagree     2
3            Neither     3
4     Somewhat agree     4
5     Strongly agree     5
  

Ответ №4:

Опция с extract

 library(tidyr)
library(dplyr)
df %>% 
   extract(V1, into = c("Value", "Label"), "^\[(\d )\]\s*(.*)")
#  Value             Label
#1     1 Strongly disagree
#2     2 Somewhat disagree
#3     3           Neither
#4     4    Somewhat agree
#5     5    Strongly agree