使用带有多个条件的if语句替换数据帧(R)中的因子时出现问题

使用带有多个条件的if语句替换数据帧(R)中的因子时出现问题,r,if-statement,multiple-conditions,R,If Statement,Multiple Conditions,我有一个数据帧测验,看起来像这样 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 Q

我有一个数据帧测验,看起来像这样

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外,所有列均为因子

我想使用以下内容创建另一个factor列quick$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}
if((测验$Group==1)和(测验$Test=='Qz2'|测验$Test=='Qz4'))

{quick$zip您可以使用嵌套的
ifelse

transform(df, zip = factor(ifelse(Group == 1 & Test %in% c('Qz2', 'Qz4'), 1, 
                            ifelse(Group == 1 & Test %in% c('Qz1', 'Qz3'), 2, 3))))
或当
从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
数据

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")

df您应该看到一条错误消息,如
Bedingung hat Länge>1 und nur das erste Element wird benutzt
-可能是在英语中。它说您的if会找到多个元素,但只会使用第一个元素

通过使用
tidyverse
mutate
并将
ifelse
循环放入其中,您可以轻松克服这一问题。通过
mutate
ifelse
中的指定指定给那些条件为true的行的列

您必须要小心一点,因为第一个
ifelse
包含在第二个位置(将使用FALSE的值),第二个
ifelse
条件。如果两个条件都不为真,我选择将
0
放入

库(tidyverse)
小测验:12 x 5
#>参与者小组测验分数测验
#>              
#>1 Qz1 2.4 2
#>2 1 Qz2 3 3 3
#>3 1 Qz3 2 2
#>4 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

由(v0.3.0)

if
else
在2020-02-06创建,用于处理单个值。您为它们提供了完整的向量。(它只使用了第一行中的值。你应该得到警告消息。
ifelse
适用于整个向量。这一次,这个问题与使用因子变量无关。如果你成功了,它将是一个数字列。嵌套的ifelse成功了。我最后使用了上面建议的一个变体,using frameName$newFactor