2016-01-29 3 views
0

Благодарим вас за ваш совет. Я пытаюсь создать новую переменную по нескольким объектам в цикле. Эти новые переменные генерируются функцией.R: Перекодирующие переменные через несколько объектов

К примеру, у меня есть три набора данных на уровне страны:

# Generate Example Data 
`enter code here`pop <- data.frame(country=c("US","US","CA","CA","FR","FR"),year=c(1,2,1,2,1,2),value=c(290,300,29,30,50,55)) 
gas <- data.frame(country=c("US","US","CA","CA","FR","FR"),year=c(1,2,1,2,1,2),value=c(3.10,1.80,4.50,2.50,4.50,2.50)) 
cars <- data.frame(country=c("US","US","CA","CA","FR","FR"),year=c(1,2,1,2,1,2),value=c(2.1,2.2,1.8,1.9,1.3,1.3)) 

Я хочу создать новую переменную, названную «CountryCode», используя команду CountryCode() в пакете COUNTRYCODE.

Я хотел бы выполнить операцию по отдельным объектам, как это:

library(countrycode) 
pop$ccode <- countrycode(pop$country,"iso2c","cown") 
pop$id <- (pop$ccode*10000)+pop$year 

Но у меня есть большое количество объектов. Я надеялся сделать это над петлей, как это

# Create list of variables 
vars <- c("pop","gas","cars") 
for (i in vars){ 
    i$ccode <- countrycode(country,"iso2c","cown") 
    i$id <- (i$ccode*10000)+i$year 
} 

Но это не работает. Я пытался это сделать, используя assign() в циклах и apply(), но я слишком плотный, чтобы окунуться в то, как сделать эту работу в моем случае.

Если бы кто-нибудь мог предоставить мне пример того, как это сделать с помощью моего собственного типа данных, я был бы очень благодарен.

ответ

0

Особая благодарность @Pawel за предоставление недостающей информации, необходимой для решения проблемы. Раствор был:

rm(list=ls()) 
pop <- data.frame(country=c("US","US","CA","CA","FR","FR"),year=c(1,2,1,2,1,2),value=c(290,300,29,30,50,55)) 
gas <- data.frame(country=c("US","US","CA","CA","FR","FR"),year=c(1,2,1,2,1,2),value=c(3.10,1.80,4.50,2.50,4.50,2.50)) 
cars <- data.frame(country=c("US","US","CA","CA","FR","FR"),year=c(1,2,1,2,1,2),value=c(2.1,2.2,1.8,1.9,1.3,1.3)) 


attachCodes <- function(dframe) 
{ 
    df <- dframe 
    df$ccode <- countrycode(df$country,"iso2c","cown") 
    df$id <- (df$ccode*10000)+df$year 
    return(df) 
} 

names <- list("pop","gas","cars") 
for(i in names){ 
    assign(i,attachCodes(get(i))) 
} 
0

Будет ли это работать на вас?

pop <- data.frame(country=c("US","US","CA","CA","FR","FR"),year=c(1,2,1,2,1,2),value=c(290,300,29,30,50,55)) 
gas <- data.frame(country=c("US","US","CA","CA","FR","FR"),year=c(1,2,1,2,1,2),value=c(3.10,1.80,4.50,2.50,4.50,2.50)) 
cars <- data.frame(country=c("US","US","CA","CA","FR","FR"),year=c(1,2,1,2,1,2),value=c(2.1,2.2,1.8,1.9,1.3,1.3)) 


attachCodes <- function(dframe) 
{ 
    df <- dframe 
    df$ccode <- countrycode(df$country,"iso2c","cown") 
    df$id <- (df$ccode*10000)+df$year 
    return(df) 
} 

tablesList <- list(pop,gas,cars) 
tablesList <- lapply(tablesList,attachCodes) 
+0

Благодарим за помощь. Я ценю помощь. Проблема заключается в том, что ** tablesList ** может стать очень громоздким, если вы сделаете это для более 50 таблиц данных. Я действительно не знаю, что делать со столом. Есть ли способ изменить исходные объекты ** pop **, ** gas **, ** cars **? –

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