【问题标题】:#R - FOR loop - how to loop through every element of a vector in a column of a data.frame [duplicate]#R - FOR循环 - 如何遍历data.frame列中向量的每个元素[重复]
【发布时间】:2018-06-21 21:48:56
【问题描述】:

目标是创建一个向量来指示学生是否缺席 (1)、在场 (0) 或数据是否丢失 (NA)

Present <- data$attendancecode
attendance <- c()

for (i in seq_along(Present)){
  if (is.na(i)==TRUE) {
    attendance [i] <- NA
  } else if (grepl("A|G|X|Z", i)){
    attendance [i] <- 1
  } else {attendance [i] <- 0}
}

不知道为什么这不起作用...

【问题讨论】:

标签: r for-loop


【解决方案1】:

seq_along 会给你一个索引向量,即1:length(Present)。因此,您的 is.na 调用将始终返回 false。而是这样做

for (i in seq_along(Present)){
  if (is.na(present[i])) { # don't need == TRUE, is.na returns TRUE or FALSE
    attendance [i] <- NA
  } else if (grepl("A|G|X|Z", i)){
    attendance [i] <- 1
  } else {Present [i] <- 0} # not sure what you intend to do here... do you mean to overwrite the value in Present? or do you mean to assign to attendance?
}

【讨论】:

  • 感谢您的回答!最后一个 else 的目标是分配出勤率。还有 6 个其他字母都应该等于 0。
  • @Jasmine 很好的 for 循环实践 - 现在关于 R 的很酷的事情是矢量化你的 if else 语句。你的代码会更短、更容易理解和更快:)
  • Present 是字符向量而不是值是否重要?我收到一条错误消息,指出 In is.na(attendance[i]) : is.na() 应用于“NULL”类型的非(列表或向量)
  • @Tjebo 我看了一下“如何在 ifelse 中包含 NA”,但他们只将 NA 作为两个选项之一......我有三个选项,即 NA, 1 或 0。仍然有点帮助,但不能完全解决我的代码问题...谢谢!
【解决方案2】:

我认为在您的最后一行中,您在 Present 中进行了分配,而您的意思是在 attendance 中分配。但我认为@mikeck 解决了真正的问题。

也就是说,如果您可以不使用 for 循环:

Present <- c("A", "G", "Z", "Q", "Q", NA, NA)

attendance <- purrr::map_dbl(Present, ~case_when(
  is.na(.x) ~ NA_real_,
  grepl("A|G|X|Z", .x) ~ 1,
  TRUE ~ 0
))

> attendance
[1]  1  1  1  0  0 NA NA

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-18
    • 2018-12-17
    相关资源
    最近更新 更多