【问题标题】:For loop returns NA's: return only the first match of ifelse statementFor 循环返回 NA:只返回 ifelse 语句的第一个匹配项
【发布时间】:2018-01-23 14:25:21
【问题描述】:

如何让我的 for 循环只返回 ifelse 语句的第一个匹配项?

这是我的数据框:

df <- structure(
  list(
x0 = c("0", "0", "0", "0", "0", "0", "0", "0",
       "0", "0"),
x1 = c("0", "0", "0", "0", "0", "0", "0", "0", "0",
       "0"),
x2 = c("0", "0", "0", "0", "0", "0", "0", "0", "0", "0"),
x3 = c("0", "0", "0", "0", "1", "0", "0", "0", "0", "0"),
x4 = c("0", "0", "0", "0", NA, "0", "0", "0", NA, "0"),
x5 = c("0",
       "0", "0", "0", NA, "0", "0", "0", NA, "0"),
x6 = c("0", "0",
       "0", "0", NA, "0", "0", "0", NA, "0"),
x7 = c("0", "0", "0",
       "0", NA, "0", "0", "0", NA, "0"),
x8 = c("0", "0", "0", "0",
       NA, "0", "0", "0", NA, "0"),
x9 = c("0", "0", "0", "0", NA,
       "0", "0", "0", NA, "1"),
x10 = c("0", "0", "0", "0", NA,
        "0", "0", "1", NA, "1"),
x11 = c("0", "0", "0", "0", NA,
        "0", "0", "1", NA, "2"),
x12 = c("0", "0", "0", "0", NA,
        "0", "0", "0", NA, "2"),
x13 = c("0", "0", "0", "0", NA,
        "0", "0", "1", NA, "3"),
x14 = c(NA, NA, "0", "0", NA, NA,
        NA, "2", NA, NA),
x15 = c(
  NA_character_,
  NA_character_,
  NA_character_,
  NA_character_,
  NA_character_,
  NA_character_,
  NA_character_,
  NA_character_,
  NA_character_,
  NA_character_
)
  ),
  .Names = c(
"x0",
"x1",
"x2",
"x3",
"x4",
"x5",
"x6",
"x7",
"x8",
"x9",
"x10",
"x11",
"x12",
"x13",
"x14",
"x15"
  ),
  row.names = c(NA, 10L),
  class = "data.frame"
)

这是我想要实现的预期输出:

df$expectedoutput <- c(NA, NA, NA, NA, NA, NA, NA, 'x14', NA, 'x11')

这是我获得上述输出的尝试:

df$newvar <- NA
for (i in 1:16) {
   df$newvar <- ifelse(df[,i] == "2" & is.na(df$newvar), 
                                  colnames(df[i]), NA)
}

我相信我的问题是我创建的 for 循环一直持续到最后并覆盖了发生的第一个匹配项,例如对于第 10 行,而不是完成 df[10,12] 的列名,循环继续到 df[10,16],因此返回 NA 但是,我可能是错的,也许这不是我的问题。

【问题讨论】:

  • 每次循环都在重写df$newvar,循环结束时只有最后一个存在。
  • 是的,我知道@RuiBarradas 这是我要求解决的问题...

标签: r loops if-statement


【解决方案1】:

首先,使用apply获取前2的列索引。
接下来,获取该索引对应的名称

first2 <- apply(df, MARGIN = 1, FUN = function(x) head(which(x == 2), 1))
df$newvar <- 
  vapply(first2, 
         FUN = function(x) if (length(x)) names(df)[x] else NA_character_, 
         character(1))

for 循环等效项是

df$newvar <- NA
for (i in seq_len(nrow(df))){
  first2 <- head(which(df[i, ] == 2), 1)
  df$newvar[i] <- if (length(first2)) names(df)[first2] else NA
}

【讨论】:

  • 完美!谢谢
  • 我不确定 for 循环等效是否可以推广到其他维度的数据帧,但 apply 方法可以。
  • 我不明白为什么它不会。 i 遍历行。 first2 为每一行重新定义,长度为 1 或 0。df$newvar[i] 基于 first2 进行更新。因此,唯一被引用的维度是行。如果它不概括,那就是我看不到的细微差别。
  • 是的,我想我忽略了一些事情
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-01-01
  • 1970-01-01
  • 2014-12-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多