2016-03-28 29 views
0

Saatlik verileri içeren birkaç .csv dosyası var. Her dosya, alandaki bir noktadan verileri temsil eder. Başlangıç ​​ve bitiş tarihi her dosyada farklıdır.Tarihte liste tabanındaki koşullu veri kümesi R

verileri kullanılarak R içerisine okunabilir:

lstf1<- list.files(pattern=".csv") 

lst2<- lapply(lstf1,function(x) read.csv(x,header = TRUE,stringsAsFactors=FALSE,sep = ",",fill=TRUE, dec = ".",quote = "\"")) 

head(lst2[[800]]) 
      datetime precip code 
1 2003-12-30 00:00:00  NA M 
2 2003-12-30 01:00:00  NA M 
3 2003-12-30 02:00:00  NA M 
4 2003-12-30 03:00:00  NA M 
5 2003-12-30 04:00:00  NA M 
6 2003-12-30 05:00:00  NA M 

datetimeYYYY-MM-DD-HH-MM-SS olup, precip veri değeri, code göz ardı edilebilir. Aşağıdaki koşullara göre 2015-11-30 dönemi 2015-04-01 verilerini seçmek istediğiniz lst2 her dataframe (df) için

: Bir df içinde precip Bu süre içinde tüm NAs içeriyorsa

1), silin (seçmeyin) 2) precip'un tümü NAs değilse, bunu seçin.

İstenen çıkış (lst3), 2015-04-01 - 2015-11-30 arasındaki alt-yerleşmiş verileri içerir.

sapply(names(lst2),function (x) write.csv(lst3[[x]],file = paste0(names(lst2[x]), ".csv"),row.names = FALSE)) 

The link to a sample file can be found here (~200 KB)

: lst3 yılında

Tüm dataframes ben gibi bir şey kullanarak dizine lst3 dosyaları yazabilir NA

The şeklinde ifade precip olmadan days ve hours eşit uzunluğa sahip olmalıdır

cevap

0

Size yapmaya çalışıyorsun tam olarak ne anlamak biraz zor, ama sağladığınız kayıtlı bu örneği (güzel filtre sözdizimi vardır kullanarak dplyr) yakın size almalısınız:

library(dplyr) 
df <- read.csv ("L112FN0M.262.csv") 
df$datetime <- as.POSIXct(df$datetime, format="%d/%m/%Y %H:%M") 

# Get the required date range and delete the NAs 
df.sub <- filter(df, !is.na(precip), 
        datetime >= as.POSIXct("2015-04-01"), 
        datetime < as.POSIXct("2015-12-01")) 

# Check if the subset has any rows left (it will be empty if it was full of NA for precip) 
if nrow(df.sub > 0) { 
    df.result <- filter(df, datetime >= as.POSIXct("2015-04-01"), 
          datetime < as.POSIXct("2015-12-01")) 
    # Then add df.result to your list of data frames... 
} # else, don't add it to your list 

bence Geçerli değerler de mevcutsa, veri çerçevesindeki NA'ları korumak istediğinizi söylüyorsunuz - sadece tüm dönem için NA'lar varsa atmak istiyorsunuz. Tüm NA'ları soymak istiyorsanız, sadece ilk filtre ifadesini kullanın ve işiniz bitti. Tarihlerinizi zaten doğru bir şekilde kodladıysanız, POSIXct'i kullanmanız gerekmez.

DÜZENLEME: Eğer lapply kullanabilir bu yüzden/fonksiyon sargı ağırlık:

library(dplyr) 

# Get some example data 
df <- read.csv ("L112FN0M.262.csv") 
df$datetime <- as.POSIXct(df$datetime, format="%d/%m/%Y %H:%M") 
dfnull <- df 
dfnull$precip <- NA 

# list of 3 input data frames to test, 2nd one has precip all NA 
df.list <- list(df, dfnull, df) 

# Function to do the filtering; returns list of data frames to keep or null 
filterprecip <- function(d) { 
    if (nrow(filter(d, !is.na(precip), datetime >= as.POSIXct("2015-04-01"), datetime < as.POSIXct("2015-12-01"))) > 
     0) { 
     return(filter(d, datetime >= as.POSIXct("2015-04-01"), datetime < as.POSIXct("2015-12-01"))) 
    } 
} 

# Function to remove NULLS in returned list 
# (Credit to Hadley Wickham: http://tolstoy.newcastle.edu.au/R/e8/help/09/12/8102.html) 
compact <- function(x) Filter(Negate(is.null), x) 

# Filter the list 
results <- compact(lapply(df.list, filterprecip)) 

# Check that you got a list of 2 data frames in the right date range 
str(results) 
+0

Evet! Geçerli karekter değerleri varsa ve sadece 2015-04-01 ila 2015-11-30 arası tüm dönem için NA'lar varsa lst2'den bir veri çerçevesini atmak istiyorsa, veri çerçevesindeki NA'ları korumak istiyorum. Kodunuz bunları saklamak yerine bu tarih aralığında "NAs" ile siliyor? Bu tarih aralığı için yalnızca alt kümedeki veriler, eğer preklinik hem NA'lara, hem de değerlere (ve/veya sadece değerlere) sahipse, fakat eğer tümüyle NA'lar ise, bu veri çerçevesini atın. – code123

+0

Kod, veri çerçevesinin tutulup tutulmayacağını belirlemek için 'df.sub' komutunu kullanır: tarih aralığındaki tüm NA'ları kaldırır ve bu sonucu' df.sub' içinde depolar. Daha sonra ikinci parça df'yi tutup tutmayacağınıza karar verir: if 'df.sub' boşsa, sadece NA'lar vardı, bu yüzden çıktı listenize eklemeyin. Eğer df.sub’un bazı içeriği varsa, tüm hedef tarih aralığını 'df'den' df.result' olarak alın ve çıktı listenize ekleyin. – Nat

+0

teşekkürler. Bunu tamamlamak için liste nesnesine uygulayabilir misiniz? Çok teşekkürler. – code123

0

Yazdıklarınıza dayanarak, yalnızca Bu belirli tarih aralığı için sütununda veri var ise dosyaların listesi.

> valuesExist <- function(df,start="2015-04-01 0:00:00",end="2015-11-30 23:59:59"){ 
+ sub.df <- df[df$datetime>=start & df$datetime>=end,] 
+ if(sum(is.na(sub.df$precip)==nrow(df)){return(FALSE)}else{return(TRUE)} 
+ } 
> lst2.bool <- lapply(lst2, valuesExist) 
> lst2 <- lst2[lst2.bool] 
> lst3 <- lapply(lst2, function(x) {x[x$datetime>="2015-04-01 0:00:00" & x$datetime>="2015-11-30 23:59:59",]} 
> sapply(names(lst2), function (x) write.csv(lst3[[x]],file = paste0(names(lst2[x]), ".csv"),row.names = FALSE)) 

Eğer dinamik bir başlangıç ​​ve bitiş zamanı sahip valueExist fonksiyonu içine bu değerlere sahip bir değişken atmak ve aynı değişkenle lst3 atama dize damgası değiştirmek istiyorsanız.

İki gecikme döngüsünü bir araya getirmek istiyorsanız, konuğum ol, ama alt kümesini oluşturduğumda bir boole değişkeni kullanmayı tercih ediyorum.

+0

Bu alt 'olmamalıdır.df <- df [df $ datetime> = start & df $ datetime <= end,] 'ile bir' <= end'? Fonksiyonu lst2’ye uygulamaya çalışıyorum. Yukarıdaki Nat'un açıklamasını kullanarak, geçerli değer değerleri varsa ve tüm dönem tarih aralığı için NA varsa, veri çerçevesindeki NA'ları koruyun. Burada bir hata alıyorum: lst2 <- lst2 [lst2.bool] '' lst2'de hata [lst2.bool]: geçersiz alt simge türü 'list' ' – code123

+0

Haha, evet <= son olmalı. Kopyalama yapıştırma yerine el ile işleri manuel olarak yazdığım şey budur. – mfrisch