如何测试三个变量是否相等[R]

如何测试三个变量是否相等[R],r,equality,R,Equality,我试图做if-else语句,它包含一个条件,如果数据框中的三个变量彼此相等 我希望使用相同的函数,但不确定这是否适用于三个变量 我也使用了以下内容,但R似乎不喜欢这样: geno$VarMatch <- ifelse((geno[c(1)] != '' & geno[c(2)] != '' & geno[c(3)] != '') & (geno[c(5)] == geno[c(4)] == geno[c(6)]), 'Not Important', 'Impor

我试图做if-else语句,它包含一个条件,如果数据框中的三个变量彼此相等

我希望使用相同的函数,但不确定这是否适用于三个变量

我也使用了以下内容,但R似乎不喜欢这样:

geno$VarMatch  <- ifelse((geno[c(1)] != '' & geno[c(2)] != '' & geno[c(3)] != '') 
& (geno[c(5)] == geno[c(4)] == geno[c(6)]), 'Not Important', 'Important')
我是不是应该指定一些东西,比如data.frame/vector等等。。。从SPSS的角度来看,我有点困惑

对不起,这个问题太简单了

您需要使用:

geno$VarMatch  <- ifelse((gene[c(1)] != '' & gene[c(2)] != '' & 
                          gene[c(3)] != '') & 
                          ((gene[c(5)] == gene[c(4)]) & 
                          (gene[c(4)] == gene[c(6)]))), 
                          'Not Important', 'Important')

geno$VarMatch该
=
是一个二进制运算符,返回单个逻辑值。R不期望在第一次求值之后有更多的输入,除非为向量提供布尔值
&
。您可能希望修改此选项,但这里有一个函数式编程方法的尝试:

testEqual <- function(x, y) ifelse(x == y, x, FALSE)

all(!!Reduce(testEqual, list(1:10, 1:10)))  # True
all(!!Reduce(testEqual, rep(T, 3)))         # True

all(!!Reduce(testEqual, list(1, 5, 10)))    # False
all(!!Reduce(testEqual, list(T, T, F)))     # False

testEqual这里有一个递归函数,它可以推广到任意数量的输入,并对它们运行
idential
。如果输入集的任何成员与其他成员不相同,则返回
FALSE

ident <- function(...){
    args <- c(...) 
    if( length( args ) > 2L ){
       #  recursively call ident()
       out <- c( identical( args[1] , args[2] ) , ident(args[-1]))
    }else{
        out <- identical( args[1] , args[2] )
    }    
    return( all( out ) )
}

ident(1,1,1,1,1)
#[1] TRUE
ident(1,1,1,1,2)
#[1] FALSE

ident我看到了如此复杂的结果,我的结果很简单:

all(sapply(列表(a,b,c,d),函数(x)x==d))


如果all=d,则返回TRUE all=对方。

此答案基于@John在OP下的评论。这是迄今为止最简单的方法

geno$VarMatch  <- ifelse((geno[c(1)] != '' & geno[c(2)] != '' & geno[c(3)] != '') 
 & (geno[c(5)] == geno[c(4)] & geno[c(5)] == geno[c(6)]), 'Not Important', 'Important')

geno$VarMatch如果是关于数值的,可以将数字放入数组中,然后检查数组的最大值和最小值:

if(max(list) == min(list))
   # all numbers in list are equal
else
   # at least one element has a different value

我认为您可以通过比较三个元素得出简单的泛型函数,然后使用
dplyr中的
mutate
rowwise
将它们应用于每个组合

library("tidyverse")
set.seed(123)
dta_sample <- tibble(
    colA = sample(letters, 10000, TRUE),
    colB = sample(letters, 10000, TRUE),
    colC = sample(letters, 10000, TRUE)
)

compare_strs <- function(one, two, three) {
    if (one == two) {
        if (two == three) {
            return(TRUE)
        } else {
            return(FALSE)
        }
    } else {
        return(FALSE)
    }
}

dta_sample %>%
    rowwise() %>%
    mutate(all_cols_identical = compare_strs(colA, colB, colC)) %>%
    # For results
    filter(all_cols_identical)
库(“tidyverse”)
种子集(123)
差热分析样本%
突变(全部相同=比较标准(可乐、可乐、可乐))%>%
#为了结果
过滤器(所有列均相同)
预览
#一个tible:25 x 4
#顺时针:
可乐可乐可乐可乐所有的可乐都一样
1 w为真
2 k正确
3米是真的
4 b正确
5是真的
6不正确
7是真的
8 j正确
9对
真的吗
#…还有15行

错误在于您必须成对测试
=
(即
a==b&a==c&b==c
)。但是,当然,你真的只需要测试2对,只要在这两对中包括所有三个值。这里有一个类似但更一般的问题:这与我发布的链接中接受的答案相似。优雅但我的问题是
all(!!Reduce(testEqual,rep(F,3))
将返回
FALSE
。啊!好球@flodel。谢谢你指出这一点。不过,这是一个有趣的例子!
if(max(list) == min(list))
   # all numbers in list are equal
else
   # at least one element has a different value
library("tidyverse")
set.seed(123)
dta_sample <- tibble(
    colA = sample(letters, 10000, TRUE),
    colB = sample(letters, 10000, TRUE),
    colC = sample(letters, 10000, TRUE)
)

compare_strs <- function(one, two, three) {
    if (one == two) {
        if (two == three) {
            return(TRUE)
        } else {
            return(FALSE)
        }
    } else {
        return(FALSE)
    }
}

dta_sample %>%
    rowwise() %>%
    mutate(all_cols_identical = compare_strs(colA, colB, colC)) %>%
    # For results
    filter(all_cols_identical)
# A tibble: 25 x 4
# Rowwise: 
   colA  colB  colC  all_cols_identical
   <chr> <chr> <chr> <lgl>             
 1 w     w     w     TRUE              
 2 k     k     k     TRUE              
 3 m     m     m     TRUE              
 4 b     b     b     TRUE              
 5 y     y     y     TRUE              
 6 n     n     n     TRUE              
 7 e     e     e     TRUE              
 8 j     j     j     TRUE              
 9 q     q     q     TRUE              
10 a     a     a     TRUE              
# … with 15 more rows