R Pick Первое значение заданное условие - PullRequest
0 голосов
/ 15 февраля 2020
data=data.frame("team"=c(1,1,1,2,2,2,3,3,3,4,4,4,5,5,5),
                "score"=c(4,8,10,3,10,5,4,2,7,7,5,6,5,9,1),
                "trial"=c(1,2,3,1,2,3,1,2,3,1,2,3,1,2,3),
                "sc3"=c(0,0,0,1,0,0,0,1,0,0,0,0,0,0,1),
                "sc7"=c(0,0,0,1,0,1,1,1,1,1,1,1,1,0,1),
                "sc9"=c(1,1,0,1,0,1,1,1,1,1,1,1,1,1,1),
                "sc3trial"=c(-99,-99,-99,1,1,1,2,2,2,-99,-99,-99,3,3,3),
                "sc7trial"=c(-99,-99,-99,1,1,1,1,1,1,1,1,1,1,1,1),
                "sc9trial"=c(1,1,1,1,1,1,1,1,1,1,1,1,1,1,1))

У меня есть данные с колонками «команда» и «оценка» и «триал». Я хочу создать переменные "sc3", "sc7", "sc9", "sc3trial", "sc7trial", "sc9trial", которые следуют этим правилам ::

Правила просты для "s c# ». Обратите внимание, что это для каждой группы:

  1. Для «sc3»: если оценка <= 3, sc3 = 1. В противном случае sc3 = 0. </li>
  2. Для «sc7»: если оценка <= 7, sc7 = 1. В противном случае sc7 = 0. </li>
  3. Для «sc9»: если оценка <= 9, sc9 = 1. В противном случае sc9 = 0. </li>

Правила довольно просты для "sc # trial". Обратите внимание, что они для каждой группы:

  1. Для "sc3trial": если есть "sc3" == 1, sc3trial записывает испытание, когда оно впервые произошло. Если «sc3» не равен «1», то «sc3trial» равняется «-99». Эти логики c применяются одинаково для «sc7trial» и «sc9trial»

Ответы [ 2 ]

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

Для первых 3 столбцов работает код ниже, но я не понял, что вы хотите для sc3trial, sc7trial и sc9trial.

  data$sc3 = ifelse(data$score <= 3, 1, 0)
  data$sc7 = ifelse(data$score <= 7, 1, 0)
  data$sc7 = ifelse(data$score <= 9, 1, 0)
1 голос
/ 15 февраля 2020

Мы можем использовать map для сравнения с score

library(dplyr)
library(purrr)
map(c(3, 7, 9), ~ +(data$score <= .x)) %>%
     set_names(c('sc3', 'sc7', 'sc9')) %>% 
     bind_cols(data %>% select(-c(sc3, sc7, sc9)), .)

Если у нас всего 3 переменные, то

data %>% 
   mutate(sc3 = + (score <=3), sc7 = +(score <=7), sc9 = +(score <= 9)) %>%
   group_by(team) %>%
   mutate(sc3trial = c(-99, 1)[(any(sc3 == 1)) + 1],
           sc7trial = c(-99, 1)[(any(sc7 == 1)) + 1]
          sc9trial = c(-99, 1)[(any(sc9 == 1)) + 1])

Или в base R

nm1 <- c('sc3', 'sc7', 'sc9')
data[nm1] <- +(data[nm1] <= c(3, 7, 9)[col(data[nm1])])
...