Как создать столбец на основе значений другого, используя dplyr, не записывая каждое значение? - PullRequest
0 голосов
/ 15 апреля 2020

Есть ли способ сделать это более эффективно? Я хочу создать столбец типа элемента. У каждого участника разное количество предметов, так что это действительно сложно. Вот игрушечный пример моих данных

structure(list(id = c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 
2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 
2L, 2L), condition = c("high", "high", "high", "high", "high", 
"high", "high", "high", "medium", "medium", "medium", "medium", 
"medium", "medium", "medium", "low", "low", "low", "low", "low", 
"low", "low", "low", "low", "low", "low", "low", "low", "low", 
"low", "high", "high", "high", "high", "high", "high", "high", 
"medium", "medium", "medium", "medium", "medium", "medium", "medium"
), item = c("abcde", "bcdef", "cdefgh", "defgh", "efghi", "fghijk", 
"ghijkl", "hijklm", "1234", "2345", "3456", "4567", "5678", "6789", 
"7890", "onion", "celery", "tomato", "carrot", "green bean", 
"lettuce", "garlic", "abcde", "bcdef", "cdefgh", "defgh", "efghi", 
"fghijk", "ghijkl", "hijklm", "onion", "celery", "tomato", "carrot", 
"green bean", "lettuce", "garlic", "1234", "2345", "3456", "4567", 
"5678", "6789", "7890")), row.names = c(NA, -44L), class = c("tbl_df", 
"tbl", "data.frame"))

Это то, что я сделал до сих пор, но это кошмар, потому что у меня есть более ста различных предметов:

df$subs <- 0
df$subs[df$item=="abcde"] <- "A"
df$subs[df$item=="bcdef"] <- "A"
df$subs[df$item=="cdefg"] <- "A"
df$subs[df$item=="defgh"] <- "A"
df$subs[df$item=="efghi"] <- "A"

df$subs[df$item=="12345"] <- "B"
df$subs[df$item=="23456"] <- "B"
df$subs[df$item=="34567"] <- "B"
df$subs[df$item=="45678"] <- "B"
df$subs[df$item=="56789"] <- "B"

df$subs[df$item=="onion"] <- "C"
df$subs[df$item=="celery"] <- "C"
df$subs[df$item=="tomato"] <- "C"
df$subs[df$item=="carrot"] <- "C"
df$subs[df$item=="green bean"] <- "C"

Есть ли более быстрый способ сделать это с Tidyverse?

1 Ответ

0 голосов
/ 15 апреля 2020

Я думаю, что проще всего было бы использовать регулярные выражения, чтобы упростить это. Вы можете использовать Tidyverse, но это не обязательно. Вот небольшой пример:

library(tidyverse)
df %>% 
  mutate(subs = case_when(
    str_detect(item, "[a-m]{5}") ~ "A",
    str_detect(item, pattern = "\\d+") ~ "B",
                          TRUE ~ "C"))

Ключевым моментом здесь является то, что шаблоны регулярных выражений, которые вы выбираете, должны быть точными для ваших реальных данных. Я думаю, что эта версия работает для простого примера, который вы включили. Кроме того, просто чтобы заметить, что dput представление отличается от представленных данных - поэтому я выбрал [a-m] в первом шаблоне регулярных выражений.

...