For循环中if条件的问题

时间:2018-10-15 20:51:54

标签: r

我试图找到在我正在研究的数据框中无法幸存的人数最多的人。我使用了for循环遍历行,但是遇到了问题。如果条件正常,这似乎不像我。据说最大的数字是89,但实际上是670。

most_lost <- 0
    for (i in 1:dim(Titanic)[1]) {
      if (Titanic$Survived[i] == "No")  {
        if (Titanic$Freq[i] > most_lost) {
          most_lost <- Titanic$Freq[i]
        }
        print(most_lost)
      }
    }

这是打印的most_lost

的输出
[1] 0
[1] 0
[1] "35"
[1] "35"
[1] "35"
[1] "35"
[1] "35"
[1] "35"
[1] "35"
[1] "35"
[1] "387"
[1] "670"
[1] "670"
[1] "670"
[1] "89"
[1] "89"

这是我正在使用的桌子

enter image description here

2 个答案:

答案 0 :(得分:2)

能否请您检查表中的数据格式,例如Freq是否真的是数字?使用以下示例数据,您的代码对我有用-请参见以下代码。附带说明一下,最好不要将数据以图形形式发布,而是使用例如dput(data)并发布其输出,这样其他人可以更轻松地导入您的数据并检查其结构。您可以相应地编辑问题。

在任何情况下,我都想强调一点,对于您描述的任务,您不应使用循环,而应仅对表进行子集化,因为对于具有较大数据集的此类任务,循环的速度会令人无法接受。我在下面的代码末尾提供了一个示例。

Titanic = as.data.frame(cbind(Survived = rep("No", 8), Freq = c(1,2,5,0,2,3,1,1)), stringsAsFactors = F)
#   Survived Freq
# 1       No    1
# 2       No    2
# 3       No    5
# 4       No    1
# 5       No    2
# 6       No    3
# 7       No    1
# 8       No    1
most_lost <- 0
for (i in 1:dim(Titanic)[1]) {
  if (Titanic$Survived[i] == "No")  {
    if (Titanic$Freq[i] > most_lost) {
      most_lost <- Titanic$Freq[i]
    }
    print(most_lost)
  }
}
# [1] "1"
# [1] "2"
# [1] "5"
# [1] "5"
# [1] "5"
# [1] "5"
# [1] "5"
# [1] "5"

max(Titanic[Titanic$Survived == "No", "Freq"])
# [1] "5"

答案 1 :(得分:0)

如果我理解正确,则不需要for循环。

max(Titanic$Freq[Titanic$Survived == "No"])

此行通过Survived列为“ No”的行对Freq列进行子集设置,然后查找子集的Freq列的最大值。