遇到有条件的情况

时间:2019-09-18 07:03:28

标签: r

我得到了一个数据帧(测试),矩阵为4 x2。我打算使用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

在任何想法上都会感激。

2 个答案:

答案 0 :(得分:2)

你可以做

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

答案 1 :(得分:2)

我们可以使用dplyr来达到预期的结果(假设我理解逻辑(,这意味着如果X1 <0&X2> 0,则使X2 <0,在X1 <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