2

参加者が12個のアイテムを2回取得したデータセットがあります。V1 != V2 & V3 != V4彼らが注目した度合いを数値化するために、その回数などを数えたいと思います。

with(data, 'V1' != 'V2')データセット全体に対して論理TRUEを返します。このための関数も作成しようとしましたが、さまざまな変数を操作することができません。また、の存在を考えると、私は車輪の再発明をしているようですidentical()

score.mismatch <- function(data,...) {
mis <- 0
if (data$V1 != data$V2) {
    mis <- mis + 1
    return(mis)
}
if (data$V3 != data$V4) {
    mis <- mis + 1
    return(mis)
} 
    # And so on
return(mis)
}

フィードバックとヒントをありがとう。

4

2 に答える 2

2

これにより、同じ結果が得られます。

with(data, sum( sum(V1 != V2), sum(V3 != V4) ) )

数値に強制変換された場合、TRUEは1です。関数で必要な場合:

mismat <- function(df){
            mis <- with(df, sum( sum(V1 != V2), sum(V3 != V4) ) ) }

with内部関数を使用する際に発生する可能性のある問題がいくつかありますが、私は完全には理解してmismat()いませんが、これらの名前の列がない場合を除いて、ここで発生することはないと思います。

于 2012-12-08T01:24:50.507 に答える
0

質問に貼り付けたコードには、問題を引き起こす可能性のある2つの重要な問題があります。

まず、ステートメント内の変数名を囲む引用符は、 2つのリテラル文字列とwithを比較することを示しています。一方、引用符がないと、呼び出されたオブジェクトを比較すると言うでしょう。この 例では、次のことがわかります。"V1""V2" V1V2

  df <- data.frame(V1=11:13, V2=1:3)

   #   df looks like: 
   #     V1 V2
   #   1 11  1
   #   2 12  2
   #   3 13  3

  # CORRECT:  we paste the values within V1 and V2
  with(df, paste(V1, V2, sep="~"))
  [1] "11~1" "12~2" "13~3"

  # INCORRECT:  we paste the strings "V1" and "V2".
  #            There is no connection between them and df
  with(df, paste("V1", "V2", sep="~"))
  [1] "V1~V2"

次に、関数内:各if句内にreturnステートメントがあります。これは、単一のTRUE値に達すると、関数の続行を停止する必要があることを意味します。しかし、あなたが指摘していることから、私はあなたがその行動を望まないと信じています。

return句内のステートメントを削除しif、最後のステートメントのみを残すことをお勧めします。ただし、さらに可能性が高いのは、@DWinの提案を使用することです;)

于 2012-12-08T04:41:21.317 に答える