Проблема использования оператора if с несколькими условиями для замены факторов в кадре данных (R) - PullRequest
0 голосов
/ 06 февраля 2020

У меня есть тест для фрейма данных, который выглядит следующим образом

Participant  Group  Test  Marks
1             1      Qz1   2.4
1             1      Qz2   3.2
1             1      Qz3   2
1             1      Qz4   1
2             1      Qz1    3
2             1      Qz2   4
2             1      Qz3   3
2             1      Qz4   4
3             2      Qz1   4
3             2      Qz2   2
3             2      Qz3   3
3             2      Qz4   2

Предположим, что все столбцы являются факторами, кроме теста $ Marks.

Я хотел бы создать еще один тест для столбцов факторов $ zip, используя что-то вроде этого:

if ((quiz$Group==1) & (quiz$Test=='Qz2'| quiz$Test == 'Qz4'))
     {quiz$zip<-3}
else if ((quiz$Group==1) & (quiz$Test=='Qz1'| quiz$Test == 'Qz3'))
     {quiz$zip<-2}
else
     {quiz$zip<-1}

Я не могу заставить это работать, и кроме факта, что это поздно ночью, я не могу найти причину.

Ваша помощь и просвещение высоко ценится!

Ответы [ 2 ]

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

Вы можете использовать вложенные ifelse

transform(df, zip = factor(ifelse(Group == 1 & Test %in% c('Qz2', 'Qz4'), 1, 
                            ifelse(Group == 1 & Test %in% c('Qz1', 'Qz3'), 2, 3))))

Или case_when из dplyr

library(dplyr)

df %>%
  mutate(zip = factor(case_when(Group == 1 & Test %in% c('Qz2', 'Qz4') ~ 1, 
                                Group == 1 & Test %in% c('Qz1', 'Qz3') ~ 2, 
                                TRUE ~ 3)))

#   Participant Group Test Marks zip
#1            1     1  Qz1   2.4   2
#2            1     1  Qz2   3.2   1
#3            1     1  Qz3   2.0   2
#4            1     1  Qz4   1.0   1
#5            2     1  Qz1   3.0   2
#6            2     1  Qz2   4.0   1
#7            2     1  Qz3   3.0   2
#8            2     1  Qz4   4.0   1
#9            3     2  Qz1   4.0   3
#10           3     2  Qz2   2.0   3
#11           3     2  Qz3   3.0   3
#12           3     2  Qz4   2.0   3

data

df <- structure(list(Participant = structure(c(1L, 1L, 1L, 1L, 2L, 
2L, 2L, 2L, 3L, 3L, 3L, 3L), .Label = c("1", "2", "3"), class = "factor"), 
Group = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 
2L, 2L), .Label = c("1", "2"), class = "factor"), Test = structure(c(1L, 
2L, 3L, 4L, 1L, 2L, 3L, 4L, 1L, 2L, 3L, 4L), .Label = c("Qz1", 
"Qz2", "Qz3", "Qz4"), class = "factor"), Marks = c(2.4, 3.2, 
2, 1, 3, 4, 3, 4, 4, 2, 3, 2)), row.names = c(NA, -12L), class = "data.frame")
0 голосов
/ 06 февраля 2020

Вы должны были увидеть сообщение об ошибке типа Bedingung hat Länge > 1 und nur das erste Element wird benutzt - возможно, на английском sh. Он говорит, что ваш , если найдет более одного элемента, но будет использовать только первый.

Вы можете легко преодолеть это, используя tidyverse и mutate и вставив в это петли ifelse. Через mutate обозначение от ifelse будет присвоено столбцу для тех строк, для которых выполняется условие.

Вы должны быть немного осторожнее, так как первый ifelse содержится в второе место - где будет использоваться значение для FALSE - второе условие ifelse. Я решил ввести 0, если ни одно из этих условий не является ИСТИННЫМ.

library(tidyverse)

quiz <- tribble(
  ~Participant, ~Group, ~Test, ~Marks,
    1,  1,  'Qz1',   2.4,
    1,  1,  'Qz2',   3,
    1,  1,  'Qz3',   2,
    1,  1,  'Qz4',   1,
    2,  1,  'Qz1',   3,
    2,  1,  'Qz2',   4,
    2,  1,  'Qz3',   3,
    2,  1,  'Qz4',   4,
    3,  2,  'Qz1',   4,
    3,  2,  'Qz2',   2,
    3,  2,  'Qz3',   3,
    3,  2,  'Qz4',   2
  )


quiz <- quiz %>% mutate(quiz = ifelse((quiz$Group == 1) & (quiz$Test == "Qz2" | quiz$Test == "Qz4"), 3,
  ifelse((quiz$Group == 1) & (quiz$Test == "Qz1" | quiz$Test == "Qz3"), 2, 0)
))
quiz
#> # A tibble: 12 x 5
#>    Participant Group Test  Marks  quiz
#>          <dbl> <dbl> <chr> <dbl> <dbl>
#>  1           1     1 Qz1     2.4     2
#>  2           1     1 Qz2     3       3
#>  3           1     1 Qz3     2       2
#>  4           1     1 Qz4     1       3
#>  5           2     1 Qz1     3       2
#>  6           2     1 Qz2     4       3
#>  7           2     1 Qz3     3       2
#>  8           2     1 Qz4     4       3
#>  9           3     2 Qz1     4       0
#> 10           3     2 Qz2     2       0
#> 11           3     2 Qz3     3       0
#> 12           3     2 Qz4     2       0

Создано в 2020-02-06 пакетом Представить (v0.3.0)

...