2016-12-01 77 views
-2

对于一个赋值,我写了一个以“id”作为参数的函数,其中我创建了一个空数据帧,然后在for循环中读取了完整情况的数量(没有NAs)在一系列的CSV文件中。这给了我一个有两列(id,#complete cases)的数据框“dat”,我已经验证过了。现在我遇到了基于id参数的子集问题。我应该能够通过第1列至子集相当于ID:R按子列排列数据框

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") 

但是这给错误“名称”属性[2]必须是相同的长度,矢量〔1〕。什么是长度1向量?我没有问过2列数据框吗?

任何人都可以帮助我调试任何这些选项?非常感谢!

根据反馈编辑:我正确初始化数据框(感谢评论)。 (0),“nobs”= integer(0)) Str(dat)显示我已经正确地做了这个 'data.frame':0 obs。 2个变量: $ ID:整数 $ NOBS:整数 如此看来,我的问题出在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

请参阅'?data.frame'。函数中没有'ncol'参数。如果您使用'data.frame(ncol = 2)'并将其打印出来,您将看到一个名为'ncol'的列的data.frame。 – JasonWang

+0

这里有很多概念来解释。问题太广泛。我发现的一个错误是dat [,1]返回一个data.frame,你可能想使用'drop = TRUE'参数来使它成为矢量 –

回答

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 
+0

感谢您的评论。是的,使用str来查看我的立场很有用。我已经正确地使用列名初始化了我的数据框:dat < - data.frame(“ID”= integer(0),“nobs”= integer(0))和str(dat)显示'data.frame' :\t 0 obs。 2个变量: $ ID:int $ nobs:int – Joanne

+0

对于半评论感到抱歉,只是搞清楚这个系统! – Joanne

+0

也许我误解了你的问题,但我认为你所需要做的就是添加你的代码来读取我创建'dat'样本的数据,并且这个代码能够对它进行子集化。如果你有更多的问题,请阅读你的数据并粘贴'str(dat)'的输出' –