我得到了一个数据帧(测试),矩阵为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
在任何想法上都会感激。
答案 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