Классифицирующий столбец в data.frame на основе векторов - PullRequest
0 голосов
/ 07 января 2019

В следующем data.frame df я хотел бы создать новый столбец со значениями, которые будут получены из классификации столбца A. Если число, если столбец A соответствует одному из чисел в векторе G1, в новом столбце с именем Group его следует классифицировать как "G1". Аналогично, если значение в столбце A соответствует одному из значений в векторе G2, его следует классифицировать как «G2». Оставшиеся столбцы должны быть классифицированы как "G0".

A <- seq(1900,2000,1)
B <- rnorm(101,10,2)
df <- data.frame(A=A,B=B)

G1 <- c(1963,1982,1952)
G2 <- c(1920,1933,1995)

# This doesn't do what I would like it to achieve
df$group <- ifelse(df$A == G1,"G1",ifelse(df$A == G2,"G2","G0"))

Ответы [ 3 ]

0 голосов
/ 07 января 2019

Проблема в том, что вы не хотите проверять, является ли значение в столбце равным A или B; это векторы, и этот тест не имеет смысла. Вместо этого вы хотите узнать, является ли значение элементом из A или B. Настройте свой код на

df$group <- ifelse(df$A %in% G1,"G1",ifelse(df$A %in% G2,"G2","G0"))

Это сработало, когда я проверил это. Возможно, есть более элегантное решение, но оно тесно связано с вашей первой попыткой.

0 голосов
/ 07 января 2019

Вот забавная и лаконичная альтернатива:

df$group <- c("G0", "G1", "G2")[1 + 1 * df$A %in% G1 + 2 * df$A %in% G2]

У нас есть вектор из трех вариантов c("G0", "G1", "G2"). Думая поэлементно, если ни один из df$A %in% G1 и df$A %in% G2 не верен, мы выбираем "G0" (из-за 1 + ... в начале). Поскольку G1 и G2 не перекрываются, «G1» будет выбран, только если df$A %in% G1. Аналогично, индекс равен 3, и «G2» выбирается, только если df$A %in% G2.

0 голосов
/ 07 января 2019

То, что вы ищете, это

df$group <- ifelse(df$A %in% G1, "G1", ifelse(df$A %in% G2, "G2", "G0"))

, который можно лучше представить с помощью case_when из dplyr

library(dplyr)
df %>%
   mutate(group = case_when(A %in% G1 ~ "G1", 
                            A %in% G2 ~ "G2", 
                            TRUE ~ "G0"))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...