1

不可解なエラーが発生しています。次の関数を使用して、任意の列にNA観測値を含むデータフレームの行を削除しています

##### removes NA'd rows from a dataFrame
wipeNArows<-function(X){
  rowsToDelete<-unique(unlist(apply(apply(X,2,is.na),2,which)))
  if (length(rowsToDelete)>0){
    return (X[-rowsToDelete,])
  }
  else{
    return (X)
  }
}

この関数は正常に機能します。たとえば、再現可能な例は次のとおりです。

testFrame<-data.frame(x=rpois(20,10),y=rpois(20,10),z=rpois(20,10))
rowsToDelete<-sample(1:nrow(testFrame),5,FALSE)
testFrame$x[rowsToDelete]<-NA
testFrame
wipeNArows(testFrame) ### removes the rows where NA is encountered

これで、約2993行を含むデータフレームができました。このデータフレームを関数に渡すと、次のエラーが発生します。

Error in apply(apply(X, 2, is.na), 2, which) : 
error in evaluating the argument 'X' in selecting a method for function 'apply': Error in as.matrix.data.frame(X) : 
dims [product 14965] do not match the length of object [14974]

回答ありがとうございます、

4

5 に答える 5

8

私にとっては問題なく動作しますが、使用しないのはなぜですか?complete.cases

testFrame[complete.cases(testFrame),]
    x  y  z
2  10  8 13
3  11 16 18
4  11  7  7
6   8  8 14
7   9 11 11
8  12 11  5
9  10  7  4
10  7 12  9
11 10 13 11
12  9 12 10
13 10  5  8
14 13  5  8
15 11  5  5
18 13 14  7
19  2 13  8

identical(testFrame[complete.cases(testFrame),], wipeNArows(testFrame))
[1] TRUE
于 2012-07-18T06:50:29.747 に答える
4

うーん、返信ありがとうございます。complete.cases関数を認識していませんでした。しかし、それは別のエラーを与えます

 Error in complete.cases(dFrame) : not all arguments have the same length

chisq.testエラーメッセージ->ある意味でこの問題に対処しているようです。

問題のあるデータフレームの問題は、日付を含むPOSIXltオブジェクト列が含まれていることです。明らかにcomplete.casesとapplyの内部作業は、これをうまく処理していません。回避策は、strftimeを使用してキャラクターにキャストしてから、strptimeを使用して戻すことです。

ありがとう、

于 2012-07-18T07:02:59.063 に答える
4

あなたの問題を解決する別の方法はna.omit

na.omit(testFrame)

    x  y  z
2   7 11 11
3  12 10 10
4  13 10  9
6  11 10 12
7  13 14  8
8   7  9  7
9   8 11 12
10  5 10  7
11  5 15  9
12  7 13  9
15 15  8  9
16 13  7 15
17  5 10 12
18  9  8  6
20 18  7  6
于 2012-07-18T08:03:56.570 に答える
1

一般的なケースでは、データにnaが含まれていない場合、Aditya Sihagが示唆したように、問題はデータの1つである可能性があります。フレーム列のデータ型は、リストやPOSIXltオブジェクトなどのオブジェクトのリストである可能性があります。それらをキャストすることも、カラムだけでラップを使用することもできます。ただし、lapplyを適用する前に、列のデータ型がリストまたはPOSIXltでないことを再度確認し、そうであれば、キャストしてください。

于 2015-05-01T11:02:46.167 に答える
0

問題のあるデータがなければ、私は別の機能しか提案できません

wipe_na_rows <- function(X){
  X[!apply(X, 1, function(x) any(is.na(x))),]
}
于 2012-07-18T06:54:47.633 に答える