首页 > 解决方案 > 粘贴 if 条件 R

问题描述

我正在尝试编写一个if语句,根据另一列中的范围将字符串粘贴到新列中。我尝试根据其他 SO 答案对语句进行建模,但总是收到警告消息和不正确的结果。示例数据框:

    Var1 Var2
    48   Na
    4    Na
    14   Na
    7    Na
    11   Na
    44   Na
    15   Na
    37   Na
    29   Na
    22   Na
    18   Na
    17   Na
    46   Na
    24   Na
    12   Na

尝试的脚本:

df$Var2 <- if(df$Var1 >=1 & df$Var1 <= 14) {
  paste("string1")
} else if (df$Var1 >=15 & df$Var1 <=35) {
  paste("string2")
} else {
  paste ("error")
}

预期结果:

    Var1 Var2
    48   error
    4    string1
    14   string1
    7    string1
    11   string1
    44   error
    15   string2
    37   error
    29   string2
    22   string2
    18   string2
    17   string2
    46   error
    24   string2
    12   string1

当我运行上面的脚本时,我df$Var2得到error了警告:

1:在 if (df$Var1 >= 1 & df$Var1 <= : 条件长度 > 1 并且只使用第一个元素

2:在 if (df$Var1 >= 15 & df$Var1 <= : 条件长度 > 1 并且只使用第一个元素

3: 在 if (df$Var1 > 35) { : 条件长度 > 1 并且只使用第一个元素

如果有人可以提供一些关于最佳进展方式的帮助,将不胜感激。

标签: r

解决方案


如果您想以这种方式测试条件,最好使用ifelse(). 该函数if()适用于单个值,这就是您收到警告的原因,因为您想将其应用于数据帧内的变量。这里的代码:

#Code
df$Var2 <- ifelse(df$Var1 >=1 & df$Var1 <= 14,'string1',
                  ifelse(df$Var1 >=15 & df$Var1 <=35,'string2','error'))

其他选项可以根据条件使用索引:

#Code 2
df$Var2 <- 'error'
#Conditions
cond1 <- df$Var1 >=1 & df$Var1 <= 14
cond2 <- df$Var1 >=15 & df$Var1 <=35
#Assign
df$Var2[cond1]<-'string1'
df$Var2[cond2]<-'string2'

这两个选项将产生相同的输出:

df
   Var1    Var2
1    48   error
2     4 string1
3    14 string1
4     7 string1
5    11 string1
6    44   error
7    15 string2
8    37   error
9    29 string2
10   22 string2
11   18 string2
12   17 string2
13   46   error
14   24 string2
15   12 string1

使用的一些数据:

#Data
df <- structure(list(Var1 = c(48L, 4L, 14L, 7L, 11L, 44L, 15L, 37L, 
29L, 22L, 18L, 17L, 46L, 24L, 12L), Var2 = c("Na", "Na", "Na", 
"Na", "Na", "Na", "Na", "Na", "Na", "Na", "Na", "Na", "Na", "Na", 
"Na")), class = "data.frame", row.names = c(NA, -15L))

或者按照@Dan在评论dplyr中的建议使用:

library(dplyr)
#Code
df <- df %>% mutate(Var2=ifelse(Var1 >=1 & Var1 <= 14,'string1',
                                ifelse(Var1 >=15 & Var1 <=35,'string2','error')))

推荐阅读