2014-07-17 44 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