2012-12-08 73 views
2

我有一個數據集,其中參與者幾次12個項目兩次。我想要統計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) 
} 

感謝您的任何反饋意見和提示。

+0

如果@Dinin的解決方案回答你的問題,不要忘記通過在它旁邊標記對號表示 –

+0

@RicardoSaporta謝謝。我仍然在計算出StackOverflow禮節。非常感激! –

回答

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()沒有有這些名字的列。

0

有你的問題粘貼代碼的兩個重要問題有可能給你的麻煩

首先,在你的周圍with聲明變量名的引號表示比較兩個文本字符串,"V1""V2"。而沒有引號它會說比較對象稱爲V1V2 這個例子可能clrify:

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聲明。這意味着在達到一個單一的價值時,函數應該停止繼續。 但是從你所表明的,我相信你不想要那樣的行爲。

您可能希望刪除if子句中的return語句,並只保留最後一個語句。雖然,更可能的是,你可能會想要使用@Dinin的建議;)

+0

啊,這是一個很棒的提示。謝謝! –

+0

@frenchja:沒問題! –