如何读入.csv数据,然后根据条件过滤创建该数据的子集?

时间:2016-03-14 20:03:38

标签: r

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

这是问题所在: 在读取.csv的数据后,我需要创建一个新的数据集,其中只包含“value”字段介于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'

编辑:

以下是一些示例数据:

时间戳,siteid,sensorid,值
1月07日00:00:00太平洋标准时间2016,1,1,24
2016年1月7日00:00:00太平洋标准时间2016,1,2,5
2016年1月7日00:00:00太平洋标准时间2016,1,3,60
1月07日00:00:00太平洋标准时间2016,2,1,0
2016年1月7日00:00:00太平洋标准时间2016,2,2,5
1月07日00:00:00太平洋标准时间2016,2,3,100
1月07日00:00:00太平洋标准时间2016,3,1,36
2016年1月7日00:00:00太平洋标准时间2016,3,2,5
1月07日00:00:00太平洋标准时间2016,3,3,38
1月07日00:00:00太平洋标准时间2016,4,1,99
2016年1月7日00:00:00太平洋标准时间2016,4,2,5
2016年1月7日00:00:00太平洋标准时间2016,4,3,84
1月07日00:15:00太平洋标准时间2016,1,1,#ERROR#
1月07日00:15:00太平洋标准时间2016,1,2,5
2007年1月7日00:15:00太平洋标准时间2016,1,3,96
2007年1月7日00:15:00太平洋标准时间2016,2,1,28
2007年1月7日00:15:00太平洋标准时间2016,2,2,5
1月07日00:15:00太平洋标准时间2016,2,3,94
2007年1月7日00:15:00太平洋标准时间2016,3,1,3
1月07日00:15:00太平洋标准时间2016,3,2,5
1月07日00:15:00太平洋标准时间2016,3,3,95
1月07日00:15:00太平洋标准时间2016,4,1,72
2007年1月7日00:15:00太平洋标准时间2016,4,2,5
1月07日00:15:00太平洋标准时间2016,4,3,21
1月07日00:30:00太平洋标准时间2016,1,1,160
2016年1月7日00:30:00太平洋标准时间2016,1,2,5
1月07日00:30:00太平洋标准时间2016,1,3,34

3 个答案:

答案 0 :(得分:0)

首先,总是试着给我们一些可重现的数据示例

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

这是如何获得具有所需值的数据。你也数据帧如何调整行和列,所以data [i]是坏的,但data [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])
      }
    }

答案 1 :(得分:0)

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

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

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

na.strings = "#ERROR#"

to read.csv()可能会解决问题。

答案 2 :(得分:0)

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

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

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