首页 > 解决方案 > if语句中长度为零的R参数

问题描述

我有一个df

df <- data.frame(id = c(1, 1, 2, 2, 3, 3, 3), 
                 year = c(1997,1997,1997,1997,1998,1998,1998),
                 usable = c(TRUE, TRUE, TRUE, TRUE, FALSE, FALSE, FALSE),
                 main = c(TRUE, TRUE, FALSE, FALSE, TRUE, TRUE, TRUE))

当我执行代码时

df$id_year <- interaction(df$id, df$year)
for (i in levels(df$id_year)) {
  rows <- df$id_year == i & df$usable
  if (!unique(df$main[rows]) {
    print("yes")
  }
}

该行出现“长度为零的参数”的错误if (!unique(df$main[rows])。谁能解释一下为什么以及如何解决它?谢谢

标签: rloopsif-statement

解决方案


该问题很可能是由于创建了未使用levels的,因为默认情况drop = FALSEinteraction

df$id_year <- interaction(df$id, df$year, drop = TRUE)

正如其他人提到的那样,在循环中!unique(并不清​​楚。如果我们检查元素lengthunique个数是否大于 0 ( if (length(unique(df$main[rows])) > 0),它将打印“yes”

for (i in levels(df$id_year)) {
   rows <- df$id_year == i & df$usable
   if (length(unique(df$main[rows])) > 0) {
     print("yes")
   }
 }
#[1] "yes"
#[1] "yes"
#[1] "yes"

推荐阅读