Запись нескольких переменных на основе состояния одной переменной - PullRequest
0 голосов
/ 14 января 2019

Я хочу перекодировать несколько переменных (около 90 из них) на основе значения в другой переменной.

Вот пример:

df <- data.frame(var1 = c(1,0,5,10,0), var2 = c(1:5), var3 = c(1:5), var4 = 
c(1:5), var5 = c(1:5), var6 = c(1:5), var90 = c(1:5))

df

  var1 var2 var3 var4 var5 var6 var90
1    1    1    1    1    1    1     1
2    0    2    2    2    2    2     2
3    5    3    3    3    3    3     3
4   10    4    4    4    4    4     4
5    0    5    5    5    5    5     5

Когда var1 = 0, я хочу перекодировать var2 в var90 как 0, в противном случае оставьте их как есть.

Я могу достаточно легко перекодировать одну переменную, используя:

df[df$var1 == 0, c("var2")] <- 0

И я могу применить это к нескольким столбцам, используя числовую запись:

df[df$var1 == 0, c(2:7)] <- 0

Что хорошо работает на этом небольшом семпле, это ожидаемый результат:

  var1 var2 var3 var4 var5 var6 var90
1    1    1    1    1    1    1     1
2    0    0    0    0    0    0     0
3    5    3    3    3    3    3     3
4   10    4    4    4    4    4     4
5    0    0    0    0    0    0     0

Однако в моем полном наборе данных (~ 90 переменных, 90 000 строк) мне пришлось прервать примерно через 20 минут, потому что он все еще не запустился (в надежде, что это запустится в считанные секунды, а не минуты).

Есть идеи, как это сделать эффективно?

Ответы [ 3 ]

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

С dplyr:

library(dplyr)

df %>%
  mutate_at(vars(var2:var90), funs(ifelse(var1 == 0, 0, .)))

Выход:

  var1 var2 var3 var4 var5 var6 var90
1    1    1    1    1    1    1     1
2    0    0    0    0    0    0     0
3    5    3    3    3    3    3     3
4   10    4    4    4    4    4     4
5    0    0    0    0    0    0     0
0 голосов
/ 14 января 2019

Мы можем использовать и математику

df[2:7] <- df[2:7] * +(df$var1 != 0)

#  var1 var2 var3 var4 var5 var6 var90
#1    1    1    1    1    1    1     1
#2    0    0    0    0    0    0     0
#3    5    3    3    3    3    3     3
#4   10    4    4    4    4    4     4
#5    0    0    0    0    0    0     0

Мы конвертируем var1 в 0, 1 для значений, которые равны 0 и не равны 0 соответственно, а затем умножаем эти значения на остальные столбцы, чтобы значения 0 становились 0, тогда как значения, отличные от 0, остаются такими, как есть.

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

Мы можем использовать set из data.table, чтобы сделать это быстрее

library(data.table)
setDT(df)
for(j in 2:7) set(df, i = which(df$var1 == 0), j = j, value = 0)
df
#   var1 var2 var3 var4 var5 var6 var90
#1:    1    1    1    1    1    1     1
#2:    0    0    0    0    0    0     0
#3:    5    3    3    3    3    3     3
#4:   10    4    4    4    4    4     4
#5:    0    0    0    0    0    0     0

Кроме того, мы можем использовать lapply из base R, чтобы избежать создания большой логической матрицы

df[2:7] <- lapply(df[2:7], function(x) replace(x, df$var1 == 0, 0))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...