【发布时间】:2018-04-24 18:55:47
【问题描述】:
我有几个数据集(“001.csv”、“002.csv”等,直到 332)存储在同一个文件夹中,具有以下结构(示例):
id p1 p2
2 35.0 na
2 5.00 2.05
2 0.35 1.56
2 na 0.79
2 5.23 0.13
2 5.01 0.03
我需要创建一个函数来读取一个或多个文件,并返回“p1”和“p2”都具有给定值(即没有 NA)的情况的数量,为此我写了这个:
cc <- function(directory, id=1:332) {
files_list <- list.files(directory, full.names = TRUE)
for (i in id) {
dat <- read.csv(files_list[i])
}
nobs <- length(which(!is.na(dat$p1) & !is.na(dat$p2)))
completecases <- data.frame(id, nobs)
completecases
}
如果我为“id”选择一个值,这将非常有效;在这种情况下,结果将类似于:
> cc(directory, 1)
id nobs
1 3
但是,如果我想知道多个文件中的观察次数,它会为每个“id”返回“id”最大值的观察次数。例如,
> cc(directory, 1:2)
id nobs
1 4
2 4
代替:
> cc(directory, 1:2)
id nobs
1 3
2 4
我相信我需要通过“id”对我的数据进行子集化,或者对每个“id”使用“rbind”,但到目前为止我未能获得正确的公式。 有谁知道如何解决这个问题?
【问题讨论】:
-
您将函数命名为 function?好的,R 可以做到这一点,但通常只有当您想混淆自己和他人时,这才是一个好主意。
library("fortunes"); fortune(77)
标签: r function dataframe subset rbind