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)
}

感谢您的任何反馈和提示。

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

粘贴在您问题中的代码中有两个重要问题可能会给您带来麻烦

首先,语句中变量名周围的引号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 回答