2016-12-01 108 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)'的輸出' –