我得到了一个矩阵为 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