Используйте case_when и начинается с, чтобы выборочно изменять строку - PullRequest
1 голос
/ 29 сентября 2019

Я пытаюсь создать новый столбец на основе другого, используя case_when, чтобы выдавать разные выходные данные в зависимости от значения каждой строки.

Я начинаю с df <- data.frame(a=c("abc", "123", "abc", "123"))

И хочу создать новый столбец b, например,

#>     a      b
#> 1 abc letter
#> 2 123 number
#> 3 abc letter
#> 4 123 number

Я пробовал df %>% mutate(b = case_when(startsWith(a, "a") ~ "letter", startsWith(a, "1") ~ "number")), но он выдает только ошибку. Может кто-нибудь показать мне, как получить различные значения для столбца b на основе первой буквы строки в столбце a?

Ответы [ 2 ]

1 голос
/ 29 сентября 2019

Согласно ?startsWith

x-вектору символьной строки, чьи «старты» считаются.

Итак, startsWith ожидает, что класс будет character и вот он factor класс. Преобразование его в класс character решит проблему

library(dplyr)
df %>%
      mutate(b = case_when(startsWith(as.character(a), "a") ~ "letter",
                 TRUE ~ "number"))
#    a      b
#1 abc letter
#2 123 number
#3 abc letter
#4 123 number

Поведение по умолчанию data.frame будет stringsAsFactors = TRUE. Если мы укажем stringsAsFactors = FALSE, столбец 'a' будет character class


Другой вариант - str_detect для создания логического выражения путем проверки, является ли символ с начала (^) строки является цифрой ([0-9])

library(stringr)
library(dplyr)
df %>% 
    mutate(b = c("letter", "number")[1+str_detect(a, "^[0-9]")])
#    a      b
#1 abc letter
#2 123 number
#3 abc letter
# 123 number
0 голосов
/ 29 сентября 2019

Вы можете просто использовать if_else(), так как здесь только два случая. Регулярное выражение кажется более подходящим, учитывая тест, который вы пытаетесь запустить;ключ в том, что ^ задает начало строки, а [:alpha:] соответствует буквам, без учета регистра.

library(tidyverse)

df <- data.frame(a=c("abc", "123", "abc", "123"))

df %>% mutate(
  b = a %>% str_detect("^[:alpha:]") %>% if_else("letter", "number")
)
#>     a      b
#> 1 abc letter
#> 2 123 number
#> 3 abc letter
#> 4 123 number

Создано в 2019-09-29 с помощью Представьте пакет (v0.3.0)

Как указал @akrun, здесь есть проблема с коэффициентами и символами - вы уверены, что это подходящий пример для вашего варианта использования, т.е. ваши реальные данные в факторах? К счастью, str_detect() работает так же хорошо в любом случае.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...