首页 > 解决方案 > 为什么这个 R 脚本不像我认为的那样对矩阵进行排序?

问题描述

我是 R 新手,所以我还不知道它的所有来龙去脉,但我认为代码应该可以工作。它应该查看从 .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

解决方案


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

不幸的是,您没有给我们一个简单的独立示例,所以我无法测试我的代码,但是这样的事情应该删除任何列中的任何数据行NA。[如果您想了解更多关于简单的自包含示例和表示的信息,请参阅这篇文章。]

library(tidyverse)

modified <- original %>% drop_na()

那有多简单?您可以以类似的方式实施范围检查:

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

推荐阅读