我有一个数据集,参与者两次拿走了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 :(得分: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()
的参数没有列出那些名。
答案 1 :(得分:0)
在您的问题中粘贴的代码中存在两个可能会给您带来麻烦的重要问题
首先,with
语句中变量名称周围的引号表示要比较两个文字字符串,"V1"
和"V2"
。如果没有引号,它会说比较名为 V1
和V2
的对象
这个例子可能是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
语句。这意味着在达到单个TRUE
值时,该函数应该停止继续。
但是根据你的指示,我相信你不希望这种行为。
您可能希望删除return
子句中的if
语句,并只保留最后一个语句。虽然,更有可能的是,你可能想要使用@DWin的建议;)