2016-03-14 59 views
2

我是R編程的新手,雖然我已經編寫了很多年的其他語言。我很難通過搜索R文檔和堆棧溢出等來找到關於這個簡單問題的任何相關信息,所以一些幫助將非常感謝。如何讀取.csv數據,然後根據條件過濾創建數據的子集?

以下是問題: 從.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' 

編輯:

下面是一些樣本數據:

時間戳,SITEID,sensorid ,值
Thu Jan 07 00:00:00 PST 2016,1,1, 24
Thu Jan 07 00:00:00 PST 2016,1,2,5
Thu Jan 07 00:00:00 PST 2016,1,3,60
Thu Jan 07 00:00:00 PST 2016, 2,1,0
Thu Jan 07 00:00:00 PST 2016,2,2,5
Thu Jan 07 00:00:00 PST 2016,2,3,100
Thu Jan 07 00:00:00 PST 2016,3,1,36
Thu Jan 07 00:00:00 PST 2016,3,2,5
Thu Jan 07 00:00:00 PST 2016,3,3,38
Thu Jan 07 00: 00:00 PST 2016,4,1,99
Thu Jan 07 00:00:00 PST 2016,4,2,5
Thu Jan 07 00:00:00 PST 2016,4,3,84
Thu Jan 07 00:15:00 PST 2016,1,1,#錯誤#
Thu Jan 07 00:15:00 PST 2016, 1,2,5
Thu Jan 07 00:15:00 PST 2016,1,3,96
Thu Jan 07 00:15:00 PST 2016,2,1,28
Thu Jan 07 00:15: 00 PST 2016,2,2,5
2016年1月07日00:15:00 PST 2016,2,3,94
Thu Jan 07 00:15:00 PST 2016,3,1,3
Thu Jan 07 07 00:15:00 PST 2016,3,2,5
Thu Jan 07 00:15:00 PST 2016,3,3,95
Thu Jan 07 00:15:00 PST 2016,4,1,72
Thu Jan 07 00:15:00 PST 2016,4,2,5
Thu Jan 07 00:15:00 PST 2016,4,3 ,21
Thu Jan 07 00:30:00 PST 2016,1,1,160
Thu Jan 07 00:30:00 PST 2016,1,2,5
Thu Jan 07 00:30:00 PST 2016,1 ,3,34

回答

0

首先,總是試圖給我們的數據

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

這一些reproductible例如,你如何讓用需要的值數據。此外,你的數據框架如何dimmension行,和列,所以data [i]是壞的,但data [i,]是一個數據框的i行。

print(data[i,]) #will work 

與您的數據

#閱讀從傳感器文件

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

這是偉大的,我知道了現在的工作。謝謝你的幫助! – cjbrog

+0

如果答案滿足你,請給我向上箭頭。 –

+1

我首先需要15個聲望,我試過了。 – cjbrog

0

數據如果函數as.integer拋出一個錯誤,那麼也許read.csv()有沒有以as.integer()可以處理的格式讀取值。

使用STR(數據)或頭()和尾(),看看有什麼read.csv()是生產。#

看着你的數據。例如,加入的說法

na.strings = "#ERROR#" 

到read.csv()可能會解決這個問題。

+0

您的str(數據)提示指向正確的方向。謝謝! – cjbrog

0

對於初學者來說,R中循環通常是相當緩慢的,應謹慎使用。對於只有2,500條記錄的數據集,它可能不是問題,但值得一提的是,如果您要開始使用更大的數據集。

如果你打算做了很多數據操縱的,我會建議熟悉的dplyr庫,https://cran.r-project.org/web/packages/dplyr/dplyr.pdf。它使數據操作非常快速和簡單。

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

我會檢查一下,謝謝。 – cjbrog

相關問題