对于赋值,我编写了一个以“id”作为参数的函数,在其中我创建了一个空数据帧,然后在for循环中读取一系列CSV文件中的完整个案数(无NA) 。这给了我一个带有两列(id,#完整例)的数据框“dat”,我已经验证了这一点。现在我遇到基于id参数的子集化问题。我应该能够按列1进行子集,这相当于id:
dat[which(dat[, 1] %in% id),]
但是当我运行此函数时,没有返回任何内容(没有输出,没有错误)。在对这个网站和其他网站进行一些搜索后,我尝试在创建数据框时命名列,以便在子集中调用列:
dat <- data.frame("monitor"=integer(), "nobs"=integer())
dat_subset <- dat[which(dat[, "monitor"] %in% id),]
但是这会返回“未定义列选中”。所以我尝试用另一种方式指定数据框:
dat <- data.frame(ncol=2)
colnames(dat) <- c("ID", "nobs")
但是这给出了错误'names'属性[2]必须与vector [1]的长度相同。 1矢量的长度是多少?我没有要求2列数据框吗?
任何人都可以帮我调试这些选项吗?非常感谢!
根据反馈进行编辑:我正确地按数据框初始化(感谢评论)。
dat&lt; - data.frame(“ID”=整数(0),“nobs”=整数(0))
Str(dat)
显示我已正确完成此操作
'data.frame':0 obs。 2个变量:
$ ID:int
$ nobs:int
所以我的问题似乎在于后面的for循环,因为在循环显示列名已被删除后使用str(dat)
:
for (i in 1:332) {
nobs <- sum(complete.cases(read.csv(files_list[i])))
rowvector <- c(i,nobs)
dat <- rbind(dat, rowvector)
}
'data.frame': 332 obs. of 2 variables:
$ X1L : int 1 2 3 4 5 6 7 8 9 10 ...
$ X117L: int 117 1041 243 474 402 228 442 192 275 148 ...
为数据框添加行时,为什么名称不会粘住? ?rbind
声明“列名取自第一个带有适当名称的参数”。
答案 0 :(得分:0)
我相信这是你正在寻找的,利用subset
功能。
fun <- function(want) {
# Here's a random example
# dat <- data.frame(id = rep(1:3, each = 3),
# n_complete = as.integer(runif(9, max = 100)))
# > str(dat)
# 'data.frame': 9 obs. of 2 variables:
# $ id : int 1 1 1 2 2 2 3 3 3
# $ n_complete: int 3 80 5 84 67 83 48 49 52
# Or using the file reading code from the question edit
# dat <- data.frame(id = integer(), n_complete = integer())
# for (i in 1:332) {
# nobs <- sum(complete.cases(read.csv(files_list[i])))
# dat <- rbind(dat, data.frame(id = i, n_complete = nobs))
# }
# Better yet, preallocate dat before filling
dat <- data.frame(id = 1:332, n_complete = 0)
for (i in dat$id) {
nobs <- sum(complete.cases(read.csv(files_list[i])))
dat$n_complete[i] <- nobs
}
# Subset by requesting specific id values
return(subset(dat, id %in% want))
}
# Ask for ids 1 and 2
fun(c(1, 2))
# > str(fun(c(1, 2)))
# 'data.frame': 6 obs. of 2 variables:
# $ id : int 1 1 1 2 2 2
# $ n_complete: int 3 80 5 84 67 83