如何读入.csv数据,然后基于条件筛选创建该数据的子集



我是R编程的新手,尽管我已经编写了许多其他语言多年。通过搜索 R 文档和堆栈溢出等,我很难找到有关这个简单问题的任何相关信息,因此非常感谢一些帮助。

问题是这样的:从.csv读取数据后,我需要创建一个新数据集,该数据集仅包含"值"字段介于 0 和 100 之间的观测值(有 4 个字段和 ~2500 行数据)。我在读取数据并显示数据时没有问题。我的问题是当我尝试获取输入数据列表并根据"值"列的范围条件对其进行过滤时。

这是我的意见:

   #read in the data from the sensor file
    data = read.csv("C:/Code/sensor.txt", header=TRUE)
    for (i in seq(4, nrow(data), 4)) {
      if (as.integer(data[i])>0) {
        print(data[i])
      }
    }

我得到错误输出:

> for (i in seq(4, nrow(data), 4)) {
+   if (as.integer(data[i])>0) {
+     print(data[i])
+   }
+ }
Error: (list) object cannot be coerced to type 'integer'

编辑:

下面是一些示例数据:

时间戳、站点 ID、

传感器 ID、值
星期四 1月 07 00:00:00 PST 2016,1,1,24
星期四 1月 07 00:00:00 PST 2016,1,2,5
太平洋标准时间 2016,1,3,60
年 1 月 07 日星期四 00:00:001 月 07 日星期四 00:00:00 PST 2016,2,1,0
星期四 1月 07 00:00:00 PST 2016,2,2,5
太平洋标准时间 2016,2,3,100
年 1 月 07 日星期四 00:00:002016,3,1,36
年 1 月 07 日星期四 00:00:00 PST太平洋标准时间 2016,3,2,5
年 1 月 07 日星期四 00:00:002016,3,3,38
年 1 月 07 日星期四 00:00:00 PST2016,4,1,99
PST 1 月 07 星期四 00:00:002016,4,2,5
PST 1 月 07 星期四 00:00:002016,4,3,84
年 1 月 07 日星期四 00:00:00 PST星期四 1月 07 00:15:00 PST 2016,1,1,#错误#
星期四 1月 07 00:15:00 PST 2016,1,2,5
太平洋标准时间 2016,1,3,96 年 1 月 07 日星期四 00:15:00
2016,2,1,28
年 1 月 07 日星期四 00:15:00 PST1 月 07 日星期四 00:15:00 PST 2016,2,2,5
太平洋标准时间 2016,2,3,94 年 1 月 07 日星期四 00:15:00
1 月 07 日星期四 00:15:00 PST 2016,3,1,3
星期四 1月 07 00:15:00 PST 2016,3,2,5
1 月 07 日星期四 00:15:00 PST 2016,3,3,95
1 月 07 日星期四 00:15:00 PST 2016,4,1,72
星期四 1月 07 00:15:00 PST 2016,4,2,5
太平洋标准时间 2016,4,3,21
年 1 月 07 日星期四 00:15:00太平洋标准时间 2016,1,1,160
年 1 月 07 日星期四 00:30:001 月 07 日星期四 00:30:00 PST 2016,1,2,5
1 月 07 日星期四 00:30:00 PST 2016,1,3,34

首先,总是尝试给我们一些可复制的数据示例

data.beetween0and100 <- data[data$column.with.values => 0 & data$column.with.values <=100,]

通过这种方式获取具有所需值的数据。还有你的数据框如何区分行和列,所以数据[i]是坏的,但是,数据[i,]是数据帧的i行。

print(data[i,]) #will work

随您数据

#read 传感器文件中的数据

    data = read.csv("C:/Code/sensor.txt", header=TRUE)
    for (i in seq(4, nrow(data), 4)) {
      if (as.integer(data[i,numberofvaluecolumn])>0) {
        print(data[i,numberofvaluecolumn])
      }
    }

对于初学者来说,R 中的循环通常非常慢,应谨慎使用。 对于只有 2,500 条记录的数据集,这可能不是问题,但如果您要开始使用更大的数据集,则值得一提。

如果您要进行大量数据操作,我建议您熟悉dplyr库,https://cran.r-project.org/web/packages/dplyr/dplyr.pdf。 它使数据操作非常快速和容易。

data<-data %>%
    filter(values>0,values<100)

如果函数 as.integer 抛出错误,那么 read.csv() 可能没有以 as.integer() 可以处理的格式读取值。

使用 str(data) 或 head() 和 tail() 查看 read.csv() 正在产生什么。

查看您的示例数据,添加参数

na.strings = "#ERROR#"

阅读.csv()可能会解决问题。

最新更新