为什么这个 R 脚本没有像我认为的那样对矩阵进行排序?

Why isn't this R script sorting through the matrix like I think it's supposed to?

提问人:Albert Ai 提问时间:5/30/2020 更新时间:5/30/2020 访问量:41

问:

我是新手,所以我还不知道它的所有来龙去脉,但我认为代码应该可以工作。它应该查看从 .csv 文件中读取的不同身高、体重和收入水平的人的矩阵,然后删除任何值为 NA 或任何值不在特定给定范围内(例如身高为 4.5 到 6.5)的任何行。当我运行脚本时,有些人被删除了,但仍有人的 NA 值或值超出给定范围,所以我不知道它是否只删除了一定数量的不适合的人,或者它是否完全删除了错误的人,或者两者兼而有之。

original = read.csv("C:/Users/gsbal/OneDrive/Documents/Quants R Course/HW/A2-C-DirtyData.csv")

nums = 1:nrow(original)
toDelete = 0
deleted = 0
for (i in nums)
{
  na = is.na(original[i, 1]) | is.na(original[i, 2]) | is.na(original[i, 3])
  if (na == T)
  {
    toDelete = i - deleted
    original = original[-toDelete,]
    deleted = deleted + 1
  }
}

nums = 1:nrow(original)
toDelete = 0
deleted = 0
for (i in nums)
{
  height = original[i, 1] < 4.5 | original[i, 1] > 6.5
  if (height == T)
  {
    toDelete = i - deleted
    original = original[-toDelete,]
    deleted = deleted + 1
  }
}
r

评论

0赞 duckmayr 5/30/2020
欢迎来到 Stack Overflow!帮助我们帮助您:提供一个最小的可重现示例。特别是,我们无权访问您的数据。可以编辑问题以包含 R 命令的输出,以便以其他人易于放入其 R 会话的格式提供数据。(如果数据集较大,则可以使用 for some 来提供可管理的子集)。dput(original)dput(head(original, n))noriginal
1赞 duckmayr 5/30/2020
也就是说,我给你的总体评论是继续使用逻辑向量,而不是一个接一个地循环。循环在 R 中表现不佳,这通常是没有根据的,但在这里我建议避免使用循环,这样您就可以避免尝试更改索引以考虑已删除的行。使用向量,您可以发现所有坏行,然后一次性删除它们。

答:

2赞 Limey 5/30/2020 #1

R 的一大优势是它适用于数据列,而不是单个值。因此,您应该能够在不求助于循环的情况下完成所有您想做的事情。我推荐作为一个几乎总是有帮助的软件包。用其开发人员的话来说,它是“固执己见的”——确实如此——但它也非常好。tidyverse

不幸的是,您没有给我们一个简单的独立示例,因此我无法测试我的代码,但是像这样的东西应该会删除任何列中带有 a 的数据的任何行。[如果您想了解更多关于简单的独立示例和响应,请参阅此帖子NA

library(tidyverse)

modified <- original %>% drop_na()

这有多简单?您可以通过类似的方式实现范围检查:

modifiedAgain <- modified %>% filter(height < 4.5 | height > 6.5)