2014-07-17 92 views
0

我有以下跟蹤號碼的功能。在不同的日子裏,由一個人在城市和城鎮中運行。我有3列。身份證(一個人)城市鎮。對於相同的身份證號碼,我有不同的英里數值,如果沒有英里跑過的話,可以在INA城市和城市或NA中使用。因此,對於ID = 1的城市和城鎮,我可以在ID = 1的多行中使用不同的值,對於ID = 2等,也可以使用相同的值。我有一個每個Id 500個CSV文件,現在我需要計算IDS和IDS的組合,以下是我的功能。返回NA,儘管有效值爲平均函數

milesmean <- function(directory, place, id = 1:500){ 
    if(directory == "miledata"){ 
    files <- list.files() 
    data <- list() 
    for (i in 1:500){ 
     data[[i]] = read.csv(files[[i]]) 
    } 
    req.data <- vector("list", length = length(id)) 
    for(j in id){ 
     req.data[[j]] <- data[[j]]$place 
    } 
    mean(unlist(req.data), na.rm=TRUE) 
    } 

}

但是當我打電話milesmean( 「miledata」, 「城市」,1:10)我得到NA爲值和報警信息

Warning message: 
In mean.default(unlist(req.data), na.rm = TRUE) : 
    argument is not numeric or logical: returning NA 

有什麼理由? TIA。注:我只需要通過循環不使用lapply和其他類似的功能

+0

原因給出的是警告信息:'unlist(req.data)'的最終值既不是數字也不是邏輯。從文件中讀取數據時,應檢查數據是否被導入爲「字符」或「因子」。 – juba

+0

但是,當我執行讀取文件的內部代碼,然後調用平均函數時,它只給我一個有效的值,只有當我把它放在一個func中我得到這個警告信息 – Arin

回答

2

線來解決這個:

req.data[[j]] <- data[[j]]$place

正在尋找一個在進口data.frame硬是叫「地方」列。如果您希望使用的參數提供的價值place你需要將其更改爲:

req.data[[j]] <- data[[j]][[place]]

至於有沒有所謂的「地方」的數據列成爲空值的列表,而且這些形成一個NULL當不公開時,這是什麼導致警告的平均功能。

你或許可以切出的第一個循環過,留給你:

milesmean <- function(directory, place, id = 1:500){ 
    if(directory == "miledata"){ 
    files <- list.files() 
    req.data <- vector("list", length = length(id)) 
    for(j in seq_along(id)){ 
     req.data[[j]] <-read.csv(files[[id[j]]])[[place]] 
    } 
    mean(unlist(req.data), na.rm=TRUE) 
    } 
} 

保存讀取你不使用的平均文件。

+0

@janos,我認爲它會工作的很好,因爲它是(承認沒有測試過),因爲您可以將data.frames作爲索引列表(正如我所做的那樣)或作爲矩陣處理。 – Miff

+0

哦,我明白了,你是對的! – janos

+0

感謝您的回覆。 @Miff執行代碼,並調用函數如milemean(「miledata」,「city」,1)我得到以下錯誤文件[[j]] [[city]]中的錯誤:下標越界。爲什麼我可以得到這個的任何理由? – Arin