Создать столбец категории в зависимости от другого столбца в R - PullRequest
0 голосов
/ 02 мая 2018

У меня есть данные, где каждое замечание (строка) имеет уникальный id. В зависимости от первой буквы этого id наблюдения можно разделить на две группы. Я хочу, чтобы столбец / переменная идентифицировали группу.

Следующий код работает. Но мой вопрос: есть ли более элегантный R-способ сделать это?

> df <- data.frame(id = c("C-1", "P-2", "P-3", "C-2"))
> df$tmp_id <- startsWith(as.character(df$id), "C-")
> df
   id tmp_id
1 C-1   TRUE
2 P-2  FALSE
3 P-3  FALSE
4 C-2   TRUE
> df$typ[df$tmp_id == TRUE] <- "C"
> df$typ[df$tmp_id == FALSE] <- "P"
> df$typ <- factor(df$typ, levels=c("C", "P"), labels=c("Cheese", "Pork"))
> df
   id tmp_id    typ
1 C-1   TRUE Cheese
2 P-2  FALSE   Pork
3 P-3  FALSE   Pork
4 C-2   TRUE Cheese
> df$tmp_id <- NULL
> df
   id    typ
1 C-1 Cheese
2 P-2   Pork
3 P-3   Pork
4 C-2 Cheese

И расширение моего вопроса: как бы я справился с этой ситуацией, если бы у меня было более двух групп? е. г. Cheese, Pork, Candy, Chocolate

Ответы [ 2 ]

0 голосов
/ 02 мая 2018

Простой подход заключается в создании именованного вектора, скажем types, для использования в качестве таблица поиска, чтобы связать префиксы с группами. Затем вы можете извлечь префикс из столбца id и индексировать вектор поиска, чтобы найти название соответствующей группы:

df <- data.frame(id = c("C-1", "P-2", "P-3", "C-2"))

types <- c(C = "Cheese", P = "Pork")
df$typ <- types[substr(df$id, 1, 1)]

df
#>    id    typ
#> 1 C-1 Cheese
#> 2 P-2   Pork
#> 3 P-3   Pork
#> 4 C-2 Cheese

Если вы хотите добавить дополнительные группы, все, что вам нужно сделать, это добавить еще Отображения префиксной группы в векторе, действующем как справочная таблица:

df <- data.frame(id = c("Ch-1", "Po-2", "Po-3", "Ca-2"))

types <- c(Ca = "Candy", Ch = "Cheese", Po = "Pork")
df$typ <- types[substr(df$id, 1, 2)]

df
#>     id    typ
#> 1 Ch-1 Cheese
#> 2 Po-2   Pork
#> 3 Po-3   Pork
#> 4 Ca-2  Candy

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

Создано в 2018-05-02 пакетом Представ (v0.2.0).

0 голосов
/ 02 мая 2018

Пакет dplyr может справиться с этим красноречиво. Я думаю, что вы после, если flagging или flag переменная / столбец. Это скажет вам, какие строки соответствуют определенному условию, а какие - нет. Следующий код сгенерирует флаг, закодированный как 1 для всех строк, которые начинаются с C в столбце id. Столбец type - это просто еще один флаг, который можно создать таким же образом с помощью оператора ifelse.

require(dplyr)

df <-  data.frame(id = c("C-1", "P-2", "P-3", "C-2")) # OP's dataset

df %>% 
  mutate(flag = ifelse(str_detect(id,'C'),1,0), # mutate adds columns
         type = ifelse(flag == 1,'Cheese','Pork')) 


# A tibble: 4 x 3
  id     flag type  
  <chr> <dbl> <chr> 
1 C- 1   1.00 Cheese
2 P- 2   0    Pork  
3 P- 3   0    Pork  
4 C- 4   1.00 Cheese
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...