Создать пустышку на основе векторов персонажей в r - PullRequest
1 голос
/ 12 июля 2019

Я хочу создать фиктивную переменную, если все записи (в столбцах value_1_value_3) равны заданному символу (например, "C") или являются NA.

Пример игрушки:

df <- data.frame(state=rep("state"),
               candidate=c("a","b","c"),
               value_1= c("A","B","C"),
               value_2= c("A","B",NA),
               value_3= c("C",NA,NA), stringsAsFactors = FALSE)

Desiderata:

df <- data.frame(state=rep("state"),
             candidate=c("a","b","c"),
             value_1= c("A","B","C"),
             value_2= c("A","B",NA),
             value_3= c("C",NA,NA), 
             dummy=c(0,0,1),stringsAsFactors = FALSE)

Я пытался (но не работает):

df$dummy <- ifelse(df[-(1:2)] %in% c("C","NA"),1,0)

Ответы [ 3 ]

3 голосов
/ 12 июля 2019

Другой способ:

rowSums(df[-(1:2)] != "C", na.rm=TRUE) == 0
# [1] FALSE FALSE  TRUE

Как это работает:

  • Составить матрицу проверок для значений, отличных от "C"
  • Подсчет не- "C "значения по строкам, пропуская NA
  • Если счет равен 0, TRUE;иначе, FALSE

Смущает, df[-(1:2)] == "C" дает матрицу, а df[-(1:2)] %in% "C" - нет.Чтобы справиться с последним, сначала оберните as.matrix(df[-(1:2)]).

3 голосов
/ 12 июля 2019

Мы можем использовать apply построчно и проверить, если all записей в выбранных столбцах равно "C", игнорируя значения NA.

cols <- grep("^value", names(df))
df$dummy <- as.integer(apply(df[cols] == "C", 1, all, na.rm = TRUE))

df
#  state candidate value_1 value_2 value_3 dummy
#1 state         a       A       A       C     0
#2 state         b       B       B    <NA>     0
#3 state         c       C    <NA>    <NA>     1

Что касается вашей попытки, %in% не будет работать на всем фрейме данных, вам нужно использовать sapply / lapply для проверки значений в нескольких столбцах.На самом деле вы можете избежать ifelse здесь

df$dummy <- as.integer(sapply(df[-c(1:2)], function(x) all(x %in% c(NA, "C"))))
0 голосов
/ 12 июля 2019

Опция, использующая tidyverse

library(tidyverse)
df %>% 
   mutate(dummy = pmap_int(select(., value_1, value_3),
        ~ +(!sum(c(...) != "C", na.rm = TRUE))))
#    state candidate value_1 value_2 value_3 dummy
#1 state         a       A       A       C     0  
#2 state         b       B       B    <NA>     0
#3 state         c       C    <NA>    <NA>     1
...