Рассчитать несколько столбцов на основе порога - PullRequest
0 голосов
/ 20 февраля 2020

data

data=data.frame("student"=c(1,2,3,4,5),
"score1"=c(77,NA,52,99,89),
"score2"=c(95,89,79,89,73),
"score3"=c(92,52,73,64,90),
"score4"=c(84,57,78,81,66),
"score1x"=c(0,NA,0,1,1),
"score2x"=c(1,1,0,1,0),
"score3x"=c(1,0,0,0,1),
"score4x"=c(1,0,0,1,0))

У меня есть данные с идентификатором студента и Score1-Score4, и я надеюсь быстро и быстро создать Score1x-Score4x. Правило: если скажем, что Score1 меньше 80, то Score1x равно 0, в противном случае это 1. Я могу сделать это следующим образом: data$score1x=ifelse(score1<80,0,1), но мне интересно, есть ли способ сделать это для всех них одновременно, чтобы создать Score1x- Score4x быстрее?


Ответы [ 3 ]

1 голос
/ 20 февраля 2020

data.table решение:

setDT(data)
cols <- paste0("score", 1:4)
data[, paste0(cols, "x") := lapply(.SD, function(x) as.integer(x > 80)), .SDcols = cols]
data

   student score1 score2 score3 score4 score1x score2x score3x score4x
1:       1     77     95     92     84       0       1       1       1
2:       2     NA     89     52     57      NA       1       0       0
3:       3     52     79     73     78       0       0       0       0
4:       4     99     89     64     81       1       1       0       1
5:       5     89     73     90     66       1       0       1       0
1 голос
/ 20 февраля 2020

Попробуйте:

cbind(data, (data[, 1:4] < 80) * 1)
0 голосов
/ 20 февраля 2020

Вы можете использовать это решение dplyr, которое создает новые переменные для столбцов с "score" в имени, используя mutate_at(), а затем использует rename_at() для изменения "_x" на "x" в конце имен столбцов. :

library(dplyr)

data[1:5] %>%
  mutate_at(vars(contains("score")), list(x = ~as.integer(. > 80))) %>%
  rename_at(vars(contains("_x")), ~gsub("_", "", ., fixed = T))

  student score1 score2 score3 score4 score1x score2x score3x score4x
1       1     77     95     92     84       0       1       1       1
2       2     NA     89     52     57      NA       1       0       0
3       3     52     79     73     78       0       0       0       0
4       4     99     89     64     81       1       1       0       1
5       5     89     73     90     66       1       0       1       0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...