2016-12-06 5 views
-1

У меня есть набор кадров данных, относящихся ко многим странам, состоящими из 3-х переменных (года, А.И., ДОА). Пример для Зимбабве показано ниже,Динамического изменения типа данных для кадра данных

>str(dframe_Zimbabwe_1955_1970) 
'data.frame': 16 obs. of 3 variables: 
$ year: chr "1955" "1956" "1957" "1958" ... 
$ AI : chr "11.61568161" "11.34114927" "11.23639317" "11.18841409" ... 
$ OAD : chr "5.740789488" "5.775882473" "5.800441036" "5.822536579" ... 

Я пытаюсь изменить тип данных переменных в кадре данных ниже, так что я могу моделировать линейную аппроксимацию с использованием lm(dframe_Zimbabwe_1955_1970$AI ~ dframe_Zimbabwe_1955_1970$year).

>str(dframe_Zimbabwe_1955_1970) 
'data.frame': 16 obs. of 3 variables: 
$ year: int 1955 1956 1957 1958 ... 
$ AI : num 11.61568161 11.34114927 11.23639317 11.18841409 ... 
$ OAD : num 5.740789488 5.775882473 5.800441036 5.822536579 ... 

Ниже статического кода, способного изменить AI от характера (CHR) в числовом (NUM).

dframe_Zimbabwe_1955_1970$AI <- as.numeric(dframe_Zimbabwe_1955_1970$AI) 

Однако, когда я пытался автоматизировать код, как показано ниже, AI все еще остается символьной (CHR)

countries <- c('Zimbabwe', 'Afghanistan', ...) 

for (country in countries) { 
    assign(paste('dframe_',country,'_1955_1970$AI', sep=''), eval(parse(text = paste('as.numeric(dframe_',country,'_1955_1970$AI)', sep='')))) 
} 

Может вам совет, что я мог бы сделать неправильно?

Спасибо.

+0

Eсть no 'assign (... $ var_name, value)' function. –

+0

Каждый из ваших фреймов данных кажется очень маленьким. Почему бы вам не уложить их в один кадр данных? Тогда вам не нужен этот сложный синтаксис. –

+0

Правая сторона функции assign() создает значения, указанные ниже, eval (parse (text = paste ('as.numeric (dframe _', country, '_ 1955_1970 $ AI)', sep = ''))) [1 ] 11.615682 11.341149 11.236393 11.188414 11.108672 10.973661 10.807027 10.573861 10.326624 10.131940 10.010619 [12] 9,809184 9,676503 9,592671 9,523880 9,455642 –

ответ

1

Это будет считаться довольно некрасиво код от Teh пуристов, но, возможно, это:

for (country in countries) { 

    new_val <- get(paste('dframe_',country,'_1955_1970', sep='')) 
    new_val[] <- lapply(new_val, as.numeric) # the '[]' on LHS keeps dataframe 
    assign(paste('dframe_',country,'_1955_1970', sep=''), new_val) 
      } 

Использование функции get('obj_name') считается чище, чем eval(parse(text=...)). Было бы обработано больше R-естественно, если бы вы собрали эти данные в списке.

+0

Я Editted линии 2, как, new_val <- получить (паста ('dframe _', страну, '_ 1955_1970', Сентябрь =» ')) Выход для этого по-прежнему имеет AI в виде chr: ' data.frame ': \t 16 obs. из 3 переменных: $ Год выпуска: chr "1955" "1956" "1957" "1958" ... $ AI: chr "11.61568161" "11.34114927" "11.23639317" "11.18841409" ... $ OAD: chr " 5.740789488 "" 5.775882473 "" 5.800441036 "" 5.822536579 "... Странно. Я попробовал get() раньше и не получил никаких изменений. –

+0

'get' не выполняет никаких изменений. Его «лапно ...», как.числовой) ', который применяет это изменение. Я хотел сказать, что вы не можете сфокусироваться на изменении колонки с назначением. –

+0

Проанализируйте это дальше своими выводами. Спасибо –

2

42: Ваш код не работает так, как написано, но с некоторыми изменениями он будет. в дополнение к недостающих скобок и неверном сентября, вы не можете использовать $ «имя столбца» в правопреемника, но вам не нужно это в любом случае

for (country in countries) { 
    new_val <- get(paste('dframe_',country,'_1955_1970', sep='')) 
    new_val[] <- lapply(new_val, as.numeric) # the '[]' on LHS keeps dataframe 
    assign(paste('dframe_',country,'_1955_1970', sep=''), new_val) 
    remove(new_val) 
} 

доказательства работы:

dframe_Zimbabwe_1955_1970 <- data.frame(year = c("1955", "1956", "1957"), 
             AI = c("11.61568161", "11.34114927", "11.23639317"), 
             OAD = c("5.740789488", "5.775882473", "5.800441036"), 
             stringsAsFactors = F) 
str(dframe_Zimbabwe_1955_1970) 
'data.frame': 3 obs. of 3 variables: 
$ year: chr "1955" "1956" "1957" 
$ AI : chr "11.61568161" "11.34114927" "11.23639317" 
$ OAD : chr "5.740789488" "5.775882473" "5.800441036" 

countries <- 'Zimbabwe' 
for (country in countries) { 
new_val <- get(paste('dframe_',country,'_1955_1970', sep='')) 
    new_val[] <- lapply(new_val, as.numeric) # the '[]' on LHS keeps dataframe 
    assign(paste('dframe_',country,'_1955_1970', sep=''), new_val) 
    remove(new_val) 
} 

str(dframe_Zimbabwe_1955_1970) 
'data.frame': 3 obs. of 3 variables: 
$ year: num 1955 1956 1957 
$ AI : num 11.6 11.3 11.2 
$ OAD : num 5.74 5.78 5.8 
+0

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

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