如何测试三个变量是否相等[R]
我试图做if-else语句,它包含一个条件,如果数据框中的三个变量彼此相等 我希望使用相同的函数,但不确定这是否适用于三个变量 我也使用了以下内容,但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
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