使用带有多个条件的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