2016-12-01 8 views
-2

割り当てのために、私は引数として "id"を持つ関数を書いています。これは、ヌルデータフレームを作成し、forループで完全なケースの数(NAsなし)一連のCSVファイルに保存されます。これは、私が確認した2つのカラム(id、#完全なケース)を持つデータフレーム "dat"を与えます。今、私はid引数に基づいてこれをサブセット化するのに問題があります。私は、IDに相当するカラム1のサブセットにできなければならない:Rはデータフレームを列でサブセット化する

dat[which(dat[, 1] %in% id),] 

私はこの機能を実行すると、何も(何も出力、エラーなし)が返されていません。

dat <- data.frame("monitor"=integer(), "nobs"=integer()) 
dat_subset <- dat[which(dat[, "monitor"] %in% id),] 

が、これは「未定義の列が選択」を返します。このサイトや他のいくつか検索した後、私はデータフレームを作成したとき、私はサブセット内の列を呼び出すために何かを持っているために、列に名前を付けてみました。 [1]

dat <- data.frame(ncol=2) 
colnames(dat) <- c("ID", "nobs") 

が、これはエラーを与えるの名前 '属性[2]ベクトルと同じ長さでなければなりません。だから、私は、データフレームを指定する別の方法を試してみました。長さ1のベクトルとは何ですか?私は2列のデータフレームを要求しませんでしたか?

これらのオプションをデバッグするのに役立つ人はいますか?どうもありがとう!

フィードバックに基づいて編集:データフレームによって正しく初期化されました(コメントのおかげで)。 dat < - data.frame( "ID" =整数(0)、 "nobs" =整数(0)) Str(dat)私は正しくこれを行ったことを示しています 'data.frame':0 obs。 の$ ID:int型 $ NOBS:2つの変数の

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 ... 

を:int型 ループの後str(dat)を使用すると、列名が削除された示して私の問題は、次のループのためにあるようですのでなぜデータフレームにラインを追加するときに名前が固執しないのですか? ?rbindは、「列名は最初の引数から適切な名前で取得されます」と述べています。

+0

'?data.frame'を参照してください。関数に 'ncol'引数はありません。 'data.frame(ncol = 2)'を使ってそれを表示すると 'ncol'という名前の列を持つ' data.frame'が表示されます。 – JasonWang

+0

ここで説明する多くの概念があります。広すぎる質問。私が見つけることができる間違いの1つは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" =整数(0)、 "nobs" =整数(0))、str(dat) :\t 0 obs。 2つの変数のうち $ ID:int $ nobs:int – Joanne

+0

このシステムを理解して、申し訳ありません。 – Joanne

+0

私はあなたの質問を誤解しているかもしれませんが、私は 'dat'のサンプルを作成したデータを読み込み、それをサブセット化できるコードを追加するだけです。もっと問題がある場合は、データを読み込み、 'str(dat)'の出力を貼り付けてください。 –

関連する問題