Заполните столбец в R [используя операторы if?] На основе переменной в другом столбце - PullRequest
1 голос
/ 28 апреля 2020

Казалось бы, простая задача, с которой я борюсь:

Я собрал данные о поведении и у меня есть столбец («Поведение»), в котором я записал, какое поведение происходит. Я хотел бы сгруппировать эти поведения по категориям и заполнить столбец («BehaviorGroup») с именем категории.

Пример того, как это может выглядеть:

Behavior      BehaviorGroup
bite          aggressive contact
ram           aggressive contact
avoid         avoid
fast-approach aggressive approach
flee          avoid
fast-approach aggressive approach

etc. 

Поэтому я хотел бы использовать поведения, перечисленные в столбце «Поведение» (которое у меня уже есть), для заполнения столбца «Поведенческая группа» (который в настоящее время пусто) в зависимости от категории.

Для приведенного выше примера: «укус» и «баран» - это «агрессивный контакт», «избегать» и «бежать» - «избегать», а «быстрый подход» - «агрессивный подход»

У меня МНОГОЕ больше, но я надеюсь, что этого достаточно, чтобы начать работу над кодом для этого! Я был бы очень признателен за любую помощь в этом!

Вот код, с которым я буду работать, на основе приведенного примера:

Behavior <- c("bite", "ram", "avoid", "fast-approach", "flee", "fast-approach")
BehaviorGroup <- c("NA", "NA", "NA", "NA", "NA", "NA")
data.frame(Behavior,BehaviorGroup)

Я просто пытаюсь заполнить столбец BehaviorGroup. Заранее спасибо!

Ответы [ 2 ]

1 голос
/ 28 апреля 2020

Используя case_when из dplyr

library(tidyverse)
df %>% 
  mutate_if(is.factor, as.character) %>% 
  mutate(BehaviorGroup = case_when(Behavior %in% c("bite", "ram") ~ "aggressive contact",
                                   Behavior %in% c("avoid", "flee") ~ "flee",
                                   Behavior %in% c("fast-approach") ~ "aggressive approach"))

       Behavior       BehaviorGroup
1          bite  aggressive contact
2           ram  aggressive contact
3         avoid                flee
4 fast-approach aggressive approach
5          flee                flee
6 fast-approach aggressive approach

Или, если хотите, base и ifelse

df$BehaviorGroup <-ifelse(df$Behavior %in% c("bite", "ram"), "aggressive contact", NA)
df$BehaviorGroup[is.na(df$BehaviorGroup) == TRUE] <-ifelse(df$Behavior[is.na(df$BehaviorGroup) == TRUE] %in% c("avoid", "flee"), "flee", NA)
df$BehaviorGroup[is.na(df$BehaviorGroup) == TRUE] <-ifelse(df$Behavior[is.na(df$BehaviorGroup) == TRUE] %in% c("fast-approach"), "aggressive approach", NA)

df
       Behavior       BehaviorGroup
1          bite  aggressive contact
2           ram  aggressive contact
3         avoid                flee
4 fast-approach aggressive approach
5          flee                flee
6 fast-approach aggressive approach
0 голосов
/ 28 апреля 2020

В базе r:

d <- data.frame(Behavior,BehaviorGroup, stringsAsFactors = F)

d$BehaviorGroup[grepl("bite|ram", d$Behavior)] <- "agressive"

       Behavior BehaviorGroup
1          bite     agressive
2           ram     agressive
3         avoid            NA
4 fast-approach            NA
5          flee            NA
6 fast-approach            NA

Если вместо этого вы хотите точные совпадения:

d$BehaviorGroup[grepl("^bite$|^ram$", d$Behavior)] <- "agressive"
...