遇到条件,否则

  • 本文关键字:否则 条件 遇到 r
  • 更新时间 :
  • 英文 :


我得到了一个矩阵为 4 x 2 的数据框(测试(。我打算使用 ifelse 函数来修复数据集。代码行如下:

test <- data.frame(cbind(c(4,-5,-6,1),c("1","-3","4","-3")),stringsAsFactors = F)
test$X1 <- as.numeric(test$X1)
test$X2 <- as.numeric(test$X2)
test$X2 <- ifelse(test$X1<0 & test$X2>0, test$X2, test$X2*-1)

我们如何编写一个应用反之亦然条件的代码,这意味着如果 X1 <0 和 X2> 0,则使 X2 <0,它们在 X1 上应用相同(反之亦然,在相同的逻辑上

(预期输出为:

X1 <- 4 -5 -6 -1
X2 <- 1 -3 -4 -3

任何想法将不胜感激。

我们可以使用dplyr实现所需的结果如下(假设我理解逻辑(这意味着如果 X1 <0 和 X2> 0,则使 X2 <0,它们在 X1 上应用相同(反之亦然,在相同的逻辑上(很好(:

test %>% 
mutate(X2 = ifelse(X1 <0 & X2>0, -X2, X2),
X1 = ifelse(X2<0 & X1>0, -X1,X1))
X1 X2
1  4  1
2 -5 -3
3 -6 -4
4 -1 -3

你可以做

test$X2 <- with(test, X2 * c(1, -1)[(X1 < 0 & X2 > 0) + 1])
test$X1 <- with(test, X1 * c(1, -1)[(X1 > 0 & X2 < 0) + 1])
test
#  X1 X2
#1  4  1
#2 -5 -3
#3 -6 -4
#4 -1 -3

为了解释,让我们以第一种情况为例。

条件返回逻辑向量

with(test, X1 < 0 & X2 > 0)
#[1] FALSE FALSE  TRUE FALSE

通过添加+ 1我们将其转换为数字索引,其中FALSE变为 1,TRUE变为 2

with(test, X1 < 0 & X2 > 0) + 1
#[1] 1 1 2 1

我们使用此索引来子集c(1, -1)

c(1, -1)[with(test, X1 < 0 & X2 > 0) + 1]
#[1]  1  1 -1  1

然后

乘以X2
with(test, X2 * c(1, -1)[(X1 < 0 & X2 > 0) + 1])
#[1]  1 -3 -4 -3

最新更新