Перекодировать переменную, ссылаясь на несколько векторов / столбцов - PullRequest
0 голосов
/ 11 октября 2018

Это вопрос эффективного написания логических условий.

Допустим, я хочу перекодировать переменную, если какой-либо столбец в наборе равен определенному значению.

test <- tibble(
 CompanyA = rep(c(0:1),5),
 CompanyB = rep(c(0),10),
 CompanyC = c(1,1,1,1,0,0,1,1,1,1)
)
test

Базовый способбудет:

test$newvar <- ifelse(test$CompanyA==1 | test$CompanyB == 1 | test$CompanyC == 1,-99,0)

table(test$newvar)

Но что, если у меня несколько десятков столбцов?Я не хочу выписывать CompanyA, CompanyB и т. Д. Есть ли способ по существу использовать оператор типа %in?Вот явно неправильный метод:

condition <- columns %in% c("CompanyA", "CompanyB", "CompanyC") . # obviously doesn't work

test$newvar[condition] <- 1

Или это еще более простой способ сделать это - например, if CompanyA:CompanyC == 1, then do...?

1 Ответ

0 голосов
/ 11 октября 2018

Обзор

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

Код

# load necessary packages ----
library(tidyverse)

# load necessary data ----
test <- 
  tibble(CompanyA = rep(c(0:1),5),
         CompanyB = rep(c(0),10),
         CompanyC = c(1,1,1,1,0,0,1,1,1,1)) %>% 
  # create an 'id' column
  mutate(id = 1:n())

# calculations -----
new.var <-
  test  %>%
  # transfrom data from long to wide
  gather(key = "company", value = "value", -id) %>%
  # for each 'id' value
  # test if any 'value' is equal to 1
  # if so, return -99; else return 0
  group_by(id) %>%
  summarize(new_var = if_else(any(value == 1), -99, 0))

# left join new.var onto test ---
test <-
  test %>%
  left_join(new.var, by = "id")

# view results ---
test
# A tibble: 10 x 5
#    CompanyA CompanyB CompanyC    id new_var
#       <int>    <dbl>    <dbl> <int>   <dbl>
#  1        0        0        1     1     -99
#  2        1        0        1     2     -99
#  3        0        0        1     3     -99
#  4        1        0        1     4     -99
#  5        0        0        0     5       0
#  6        1        0        0     6     -99
#  7        0        0        1     7     -99
#  8        1        0        1     8     -99
#  9        0        0        1     9     -99
# 10        1        0        1    10     -99

# end of script #
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...