Сохранение нескольких выходов из a для l oop в r - PullRequest
0 голосов
/ 18 июня 2020

Я пытаюсь использовать для l oop несколько фреймов данных. Исходный код отлично работает для одного прогона (без for l oop).

object<- c(1,2,3)

for (i in 1:length(object)) {

df1<- SomeFunction1(object[i])
df2<- SomeFunction2(object[i])
df3<- SomeFunction3(object[i])

N.rows <- length(object)
combined <- vector("list", N.rows)

combined[i]<-list(rbind(df1,df2,df3))

Когда я делаю это, я объединяю [3], но не результаты двух других переменных в моем объекте . Я поигрался с ним и сумел получить в результате объединенный 1 , но опять же не список с объединенными 1 , объединенными [2] и объединенными [3].

ОБНОВЛЕНИЕ: меня попросили привести конкретный пример и ожидаемый результат.

Я в основном беру три файла CSV с данными переписи округа, но организованные по-разному (два с годами в виде строк и один с годами как столбцы), преобразуя данные в согласованный формат по округам и затем объединяя файлы.

enter image description here

Изображение выше является результатом просмотра (объединения) . [[2]] - это именно то, что я хочу, но ничего не хранится в [ 1 ].

Это код, который я использовал для его получения:

pop1990.2000 <- read.csv("1990-2000 Census Pop.csv", 
                     stringsAsFactors = FALSE)
pop2000.2010 <- read.csv("2000-2010 Census Pop.csv", 
                     stringsAsFactors = FALSE)
pop2010.2019 <- read.csv("2010-2019 Census Pop.csv", 
                     stringsAsFactors = FALSE)


#Adding Total column "Population"
pop1990.2000$Population <- (rowSums(pop1990.2000) - 
                   pop1990.2000$Year - 
                   pop1990.2000$FIPS.Code)

#Combining State and County FIPS codes "FIPS.Code"
pop2000.2010$FIPS.Code <- (pop2000.2010$STATE*1000+
                         pop2000.2010$COUNTY)

pop2010.2019$FIPS.Code <- (pop2010.2019$STATE*1000+
                         pop2010.2019$COUNTY)

my_counties<-c(1125, 1127)

for (i in 1:length(my_counties)) {


#Selecting Pop data for County 1125 for 1990-2000
newdata <- pop1990.2000[ which(pop1990.2000$FIPS.Code==my_counties[i]), ]
newdata2000v1 <- as.data.frame(cbind(Year=newdata$Year, 
                                 Population=newdata$Pop))

#Adding FIPs Code
newdata2000v1$FIPS.Code<-my_counties[i]


#Merging County Name by FIPS.Code
pop2000.2010.c.fips <- pop2000.2010 %>%
  select(FIPS.Code, CTYNAME)

pop2000.2010.c.fips$County<-pop2000.2010.c.fips$CTYNAME

newdata2000v1 <- newdata2000v1 %>%  
  mutate(FIPS.Code = as.numeric(FIPS.Code))

newdata2000 <- left_join(newdata2000v1, 
                     pop2000.2010.c.fips, 
                     by = "FIPS.Code")

newdata2000<-newdata2000 %>% select(County, FIPS.Code, Year, Population)


#Selecting Pop data for County 1125 for 2000-2010
newdata2 <- pop2000.2010[ which(pop2000.2010$FIPS.Code==my_counties[i]), ]

newdata2010 <- cbind("2000"=newdata2$ESTIMATESBASE2000, 
                 "2001"=newdata2$POPESTIMATE2001, 
                 "2002"=newdata2$POPESTIMATE2002, 
                 "2003"=newdata2$POPESTIMATE2003, 
                 "2004"=newdata2$POPESTIMATE2004, 
                 "2005"=newdata2$POPESTIMATE2005, 
                 "2006"=newdata2$POPESTIMATE2006, 
                 "2007"=newdata2$POPESTIMATE2007, 
                 "2008"=newdata2$POPESTIMATE2008, 
                 "2009"=newdata2$POPESTIMATE2009)

newdata2010<-as.data.frame(t(newdata2010))

newdata2010$County<-newdata2$CTYNAME
newdata2010$FIPS.Code<-newdata2$FIPS.Code

newdata2010$Year<-c(rownames(newdata2010))

names(newdata2010)[names(newdata2010) == 'V1'] <- 'Population'

newdata2010<-newdata2010 %>% select(County, FIPS.Code, Year, Population)



#Selecting Pop data for County 1125 for 2010-2019
newdata3 <- pop2010.2019[ which(pop2010.2019$FIPS.Code==my_counties[i]), ]
newdata2019 <- cbind(Year=newdata3$Year, 
                 "2010"=newdata3$CENSUS2010POP, 
                 "2011"=newdata3$POPESTIMATE2011, 
                 "2012"=newdata3$POPESTIMATE2012, 
                 "2013"=newdata3$POPESTIMATE2013, 
                 "2014"=newdata3$POPESTIMATE2014, 
                 "2015"=newdata3$POPESTIMATE2015, 
                 "2016"=newdata3$POPESTIMATE2016, 
                 "2017"=newdata3$POPESTIMATE2017, 
                 "2018"=newdata3$POPESTIMATE2018,
                 "2019"=newdata3$POPESTIMATE2019)


newdata2019<-as.data.frame(t(newdata2019))

newdata2019$County<-newdata3$CTYNAME
newdata2019$FIPS.Code<-newdata3$FIPS.Code

newdata2019$Year<-c(rownames(newdata2019))

names(newdata2019)[names(newdata2019) == 'V1'] <- 'Population'

newdata2019<-newdata2019 %>% select(County, FIPS.Code, Year, Population)



N.rows <- length(my_counties)
combined <- vector("list", N.rows)
combined[i]<-list(rbind(newdata2000,newdata2010,newdata2019))

1 Ответ

2 голосов
/ 18 июня 2020

Проблема в том, что вы повторно указываете создание объекта combined. Я не уверен, что именно ваш var1, но, возможно, должно работать следующее:

object<- c(1,2,3)
N.rows <- length(var1)
combined <- vector("list", N.rows)

for (i in 1:length(object)) {

     df1<- SomeFunction1(object[i])
     df2<- SomeFunction2(object[i])
     df3<- SomeFunction3(object[i])         

combined[i]<-list(rbind(df1,df2,df3))
}

В качестве альтернативы, используя lapply:

object<- c(1,2,3)
combined<-lapply(object, function(i){

     df1<- SomeFunction1(object[i])
     df2<- SomeFunction2(object[i])
     df3<- SomeFunction3(object[i])         

     list(rbind(df1,df2,df3))
}

Но это доставит список длиной 3 (с тремя списками с df1, df2 и df3), а не длиной, определяемой длиной var1 ...

...