2016-11-10 3 views
0

Как создать цикл вложенных циклов, который использует разные наборы данных (каждый из которых состоит из нескольких файлов данных) в качестве входных данных, а затем сохранить результаты с переменной?Вложенные петли с помощью различных наборов данных в R

Я написал цикл for, который подмножает файлы разных климатических данных для одной страны, а затем суммирует значения температуры.

Данные выглядит, как это и дается на каждый день в каждом регионе обеих стран (один файл = один регион)

Date  |Prec |Temperature 
----------|-----|-----------           
13-01-1992| 1 | 1 
14-01-1992| 0 | 1.5 
15-01-1993| 0.8 | -0.4 
16-01-1993| 0 | -2.2 
17-01-1994| 0 | -2.35 
13-01-1994| 0.3 | -2.95 
14-01-1995| 1 | -8.95 
15-01-1995| 2 | -7.25 
16-01-1996| 1.5 | -6 
17-01-1996| 0 | -8.3 
13-02-1997| 1 | -0.3 
14-02-1997| 0.1 | -0.15 
15-02-1998| 0 | -2.5 
16-02-1998| 0.2 | -3.4 
17-02-1999| 0.9 | -0.4 
16-03-1999| 2.6 | 8.4 
17-03-2000| 1.7 | 11 
18-03-2000| 4.7 | 4.65 
19-03-2001| 1 | 2.95 
20-03-2001| 0.6 | 4.7 
13-08-2002| 2 | 22.35 
14-08-2002| 1 | 20 
15-08-2003| 1.7 | 21.4 
16-08-2003| 0.5 | 21.55 
17-08-2004| 0.4 | 21.5 
17-02-2004| 0.3 | -0.6 
18-02-2005| 0.8 | -3.4 
19-02-2005| 1.2 | -3 
20-02-2006| 0.8 | 2 
21-02-2006| 6 | 1.2 

Теперь я хочу, чтобы это работать над наборами данных двух разных стран. Различное количество файлов данных относится к каждой стране. Я попытался это:

Temperature<-matrix(1995:2006,12,1) 
Country_A<-c("1.csv","2.csv","3.csv") 
Country_B<-c("4.csv","5.csv") 
country<-c(Country_A, Country_B) 
country_names<-c("Country_A "," Country_B ") 

for(j in 1:2) 
{for(i in country[j]) { 
name <- country_names[j] 
Data<-read.csv(i, header=TRUE, sep = ",") 
Data$Dates<-as.Date(Data$Date, "%d-%m-%Y") 
Data95<-subset(Data, Dates>="1995-01-01") 
Data$Years<- as.numeric(format(Data$Dates, "%Y")) 
Temperature<-cbind(Temperature, aggregate(Data95$Column1, by= list(Data95$Years),FUN=sum))}} 

Вместо прохода через одну страну за другой, как это только файлы 1 и 2 адресованы. Я думаю, проблема в country<-c(Country_A, Country_B)

Я предполагаю, что массив может быть решением для адресации отдельно по отдельности и, возможно, также для сохранения конкретной конкретной страны. К сожалению, я совершенно новичок в R, и поэтому я не знаю, как это установить. Я был бы очень рад любой помощи!

+0

Дай выборочные данные установить, что один из файлов CSV имеют. Для цикла должно быть довольно медленным –

ответ

0
Temperature<-matrix(1995:2006,12,1) 

# Below are just for understanding. Country_A represents just the names of files in the A directory  
# Country_A<-c("1.csv","2.csv","3.csv") 
# Country_B<-c("4.csv","5.csv") 

lA=list.files(path = "countryA_pathname", pattern= ".csv") 
lB=list.files(path = "countryB_pathname", pattern= ".csv") 

l1A = paste0("countryA_pathname", lA) 
# l1A = c("countryA_pathname/1.csv", "countryA_pathname/2.csv", "countryA_pathname/3.csv") 
l1B = paste0("countryB_pathname", lB) 
# l1B = c("countryB_pathname/4.csv", "countryB_pathname/5.csv") 

abc <- function(path) 
{ 
    Data = read.csv(path) 
    Data$Date<-as.Date(Data$Date, "%d-%m-%Y") 
    Data$Years<- as.numeric(format(Data$Date, "%Y")) 
    Data95 = subset(Data , Date >="1995-01-01") 
    Temperature <- ddply(Data95, "Years", function(x) sum(x$Temperature))[-1]#JUST EXTRACTS THE SUM COLUMN 
    Temperature 
} 

LA = lapply(l1A, abc) 
LB = lapply(l1B, abc) 

dA = cbind(Temperature, as.data.frame(LA)) 
colnames(dA) <- c("Temperature", lA) 
dB = cbind(Temperature, as.data.frame(LB)) 
colnames(dB) <- c("Temperature", lB) 

Надеется, что это работает

+0

добавьте данные к самому вопросу..второй мой ответ работает на вас ?! –

+0

Отчасти это было сделано. Я предположил, что L = lapply (l3, abc) вместо l, поскольку это не было определено ?! Однако, подобно этому, все суммы температур вычисляются для каждого отдельного файла. Я не знаю, есть ли возможность сделать среднее по всем файлам для каждого l1 и l2 за каждый год. – Catie

+0

в порядке ... так чтобы это правильно ... если в pathnameA и B есть 5 кадров данных, то вы хотите получить среднее значение всего 10df? и да, да это l3 –

Смежные вопросы