Вычисление новой переменной, обусловленной уровнями другой переменной - PullRequest
0 голосов
/ 13 февраля 2019

Я пытаюсь создать новую переменную (например, col3), в результате чего значения для конечной переменной вычисляются по-разному в зависимости от уровней другой переменной (например, col2).

Я пробовалНесколько различных методов, таких как создание новых переменных, а также изменение с помощью dplyr.Мои текущие данные выглядят как

> df
Grade Theta
1      -2.39
2       0.11
3       0.30
4       0.23

, и механизмы диалога с новыми переменными будут такими:

df$sstest1[df$Grade=='1']=(((df$Theta--.0961)/.657)*15)+100

df$sstest2[df$Grade=='2']=(((df$Theta--.0406)/.631)*15)+100

df$sstest3[df$Grade=='3']=(((df$Theta-.163)/.621)*15)+100

df$sstest4[df$Grade=="4"]=(((df$Theta-.318)/.702)*15)+100

Таким образом, ожидается, что новый df должен быть

> df
Grade Theta   sstest1  sstest2  sstest3 sstest4
1      -2.39  47.627
2       0.11           103.58
3       0.30                     103.31
4       0.23                             98.12

Однако результат, который я получаю, равен

> df
Grade Theta   sstest1  sstest2  sstest3 sstest4
1      -2.39  47.627
2       0.11           44.15
3       0.30                     38.33
4       0.23                             42.14

, где значение sstest1 является правильным, но я получаю предупреждения о

Warning df$sstest1[df$Grade=='1']=(((df$Theta--.0961)/.657)*15)+100 number of items to replace is not a multiple of replacement length

Warning df$sstest2[df$Grade=='2']=(((df$Theta--.0406)/.631)*15)+100 number of items to replace is not a multiple of replacement length

Warning df$sstest3[df$Grade=='3']=(((df$Theta-.163)/.621)*15)+100 number of items to replace is not a multiple of replacement length

Warning df$sstest4[df$Grade=="4"]=(((df$Theta-.318)/.702)*15)+100 number of items to replace is not a multiple of replacement length  

Перед тем, как перейти к полным операторам ifelse или mutate,Я пытаюсь согласовать, как sstest2-sstest4 выдают неправильные значения, где sstest1 выдает правильное значение.

Ответы [ 2 ]

0 голосов
/ 13 февраля 2019

Основной подход r состоит в том, чтобы ограничить правую часть уравнения теми же записями, что и левой стороной:

df$sstest1[df$Grade=='1']=(((df$Theta[df$Grade=='1']--.0961)/.657)*15)+100

df$sstest2[df$Grade=='2']=(((df$Theta[df$Grade=='2']--.0406)/.631)*15)+100

df$sstest3[df$Grade=='3']=(((df$Theta[df$Grade=='3']-.163)/.621)*15)+100

df$sstest4[df$Grade=="4"]=(((df$Theta[df$Grade=='4']-.318)/.702)*15)+100
0 голосов
/ 13 февраля 2019

Ну, с правой стороны вы вычисляете значение для каждой тэты для всех рядов.И первое значение принимается во внимание для каждой строки независимо от класса.Выполните (((df$Theta--.0406)/.631)*15)+100, и вы получите значение для каждой строки.Этот вектор из 4 элементов присваивается только одной строке в sstest2.Поэтому первый элемент вектора используется вместо второго.

Вот подход dplyr:

library(dplyr)

df <- data.frame(Grade = 1:4,
                 Theta = c(-2.39, 0.11, 0.3, 0.23))

thetafun <- function(theta, grade) {
  a <- c(-0.961, -0.0406, 0.161, 0.318)
  b <- c(0.657, 0.631, 0.621, 0.702)
  return(((theta - a[grade]) / b[grade]) * 15 + 100)
}

df %>% 
  mutate(sstest = thetafun(Theta, Grade)) %>%
  spread(key = Grade, value = sstest, sep = "")

Как вы видите, окончательный df можно назвать sstest:

  Theta Grade1 Grade2 Grade3 Grade4
1 -2.39  67.37     NA     NA     NA
2  0.11     NA  103.6     NA     NA
3  0.23     NA     NA     NA  98.12
4  0.30     NA     NA  103.4     NA
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...