2016-12-06 49 views
-1

動態變化的數據類型我有一組屬於多個國家,包括3個變量(AIOAD)的數據幀。爲津巴布韋如下圖所示的例子中,用於數據幀

>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 ... 

的下面能夠從字符(CHR)改變AI到數字(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

有沒有'assign(... $ var_name,value)'函數。 –

+0

你的每個數據框看起來都很小。你爲什麼不把它們堆疊成一個單一的數據框?那麼你不需要這個複雜的語法。 –

+0

分配(的右側)會產生如下的值, 的eval(解析(文本=膏( 'as.numeric(DFRAME _',國家, '_ 1955_1970 $ AI)',九月= ''))) [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

這將被認爲是相當醜陋的代碼由德純粹主義者,但也許這樣的:

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個變量: $ 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「... 奇怪。我早些時候試過get(),也沒有改變 –

+0

'get'沒有做任何「改變」。它的'lapply ...,如。數字)'應用更改。我的觀點是,你不能用assign來做一個專注於列的改變。 –

+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的代碼,目前正在進行同行評審。感謝您的幫助,我提出了和您一樣的建議。 –