15

我正在尝试执行 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')

不断告诉我:

Error: unexpected '==' 

我是否应该将某些内容指定为 data.frame/vector 等...从 SPSS 的角度来看,我有点困惑。

对不起,简单的查询。

4

7 回答 7

13

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

all(sapply(list(a,b,c,d), function(x) x == d))

返回 TRUE,如果 all 等于 d 都彼此相等。

于 2017-05-11T16:15:12.363 回答
6

这是一个递归函数,它泛化到任意数量的输入并identical在它们上运行。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
于 2013-11-13T23:42:21.647 回答
1

如果它是关于数值的,您可以将数字放入一个数组中,然后检查数组的最大值和最小值,以及:

if(max(list) == min(list))
   # all numbers in list are equal
else
   # at least one element has a different value
于 2020-04-25T20:00:42.700 回答
0

==是一个二元运算符,它返回单个逻辑值。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

双重否定用于将值转换为逻辑向量,该all命令返回单个布尔值。这仅适用于数值或逻辑向量。

我把它扔在这里只是为了好玩。我不确定我是否真的会使用这种方法,但欢迎任何批评。

于 2013-11-13T23:36:53.513 回答
0

你需要使用:

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')
于 2013-11-13T23:33:46.737 回答
0

我认为您可以想出一个简单的通用函数来比较三个元素,然后mutaterowwise它们dplyr应用到每个组合中。

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
于 2020-11-18T12:19:40.447 回答
0

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

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[geno[c(5)] == geno[c(4)] & geno[c(5)] == geno[c(6)]] <– 'Important'
于 2018-07-26T09:24:09.740 回答