#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