2016-08-27 5 views
1

ファイルでいっぱいのディレクトリを読み込み、各データファイルで完全に観測されたケースの数を報告する関数を記述する必要があります(観測可能なインスタンスごとにNA値はありません)。この関数は、最初の列がファイルの名前で、2番目の列が完全な場合の の番号であるデータフレームを返す必要があります。 私の下書きについては下記をご覧ください。rの正しい形式でデータフレームを出力する方法は?

complete <- function (directory, id = 1:332){ 
    nobs = numeric() #currently blank 
    # nobs is the number of complete cases in each file 
    data = data.frame() #currently blank dataframe 
    for (i in id){ 
    #get the right filepath 
    newread = read.csv(paste(directory,"/",formatC(i,width=3,flag="0"),".csv",sep="")) 
    my_na <- is.na(newread) #let my_na be the logic vector of true and false na values 
    nobs = sum(!my_na) #sum up all the not na values (1 is not na, 0 is na, due to inversion). 
    #this returns # of true values 
    #add on to the existing dataframe 
    data = c(data, i, nobs, row.names=i) 
    } 
    data # return the updated data frame for the specified id range 
} 

サンプル実行complete("specdata",1)の出力は、通常のデータフレーム形式で表示されていない理由を私はわからない

[[1]] 
[1] 1 

[[2]] 
[1] 3161 

$row.names 
[1] 1 

です。また、私の数字も正しいとは確信していません。 私は、それぞれのi番目のインスタンスでnewreadがそのファイルのすべてのデータを読み取ってからmy_naに進むという前提のもとで作業しています。それはエラーの原因ですか?それとも別のことですか?説明してください。ありがとう!

+0

は、あなたがCoursera HWをやっているように見えます。 – Nate

+1

あなたの 'for'ループで、あなたは' data'(それを上書きする)に割り当てています。 – steveb

+0

第1週はすでに予定されていますか? :) がんばろう。私はそのクラスから多くを学んだ。 –

答えて

2

ベクトルに値を追加する他の方法について考える必要があります。現在、この機能は全面的に上書きされています。あなたはid = 1のときに尋ねました。関数に複数のidを渡すと悪化します。最後のものだけが返されます。理由は次のとおりです。

#Simple function that takes ids and adds 2 to them 
myFun <- function(id) { 

    nobs = c() 

    for(i in id) { 

    nobs = 2 + i 
    } 

    return(nobs) 
} 

myFun(c(2,3,4)) 
[1] 6 

私は、各IDが値に2を加えたものの、最後のものだけを返したと言いました。私はこのように書くべきです:

myFun2 <- function(id) { 

    nobs = c() 

    for(i in 1:length(id)) { 

    nobs[i] <- 2 + id[i] 
    } 

    return(nobs) 
} 

myFun2(c(2,3,4)) 
[1] 4 5 6 

これは正しい出力を与えています。違いは?最初にnobsオブジェクトは上書きされず、追加されます。 forループヘッダーのサブセットの角かっこと新しいカウンタに注意してください。

またR.それを使用するための最良の方法はでより多くするために構築されていないオブジェクトを構築以下:

complete <- function(directory, id=1:332) { 
    nobs <- sapply(id, function(i) { 
    sum(complete.cases(read.csv(list.files(path=directory, full.names=TRUE)[i]))) }) 
    data.frame(id, nobs) 
} 

あなたは、あなたのコードを修正するような何か試してみたい場合:

complete <- function (directory, id = 1:332){ 
    nobs = numeric(length(id)) #currently blank 
    # nobs is the number of complete cases in each file 
    for (i in 1:length(id)) { 
    #get the right filepath 
    newread = read.csv(paste(directory,"/",formatC(id[i] ,width=3,flag="0"),".csv",sep="")) 
    my_na <- is.na(newread) #let my_na be the logic vector of true and false na values 
    nobs[i] = sum(!my_na) #sum up all the not na values (1 is not na, 0 is na, due to inversion). 
    #this returns # of true values 
    } 
    data.frame(id, nobs) # return the updated data frame for the specified id range 
} 
0

私はあなたが参照しているかのデータを認識していないですし、与えられた何のサンプルが存在しないので、私はあなたの関数に編集してこれを考え出すことができますので -

complete <- function (directory, id = 1:332){ 
    data = data.frame() 
    for (i in id){ 
    newread = read.csv(paste(directory,"/",formatC(i,width=3,flag="0"),".csv",sep="")) 
    newread = newread[complete.cases(newread),] 
    nobs = nrow(newread) 
    data[nrow(data)+1,] = c(i,nobs) 
    } 
    names(data) <- c("Name","NotNA") 
    return(data) 
} 
関連する問題