gpt4 book ai didi

r - For 循环有条件地翻转数据框中值的符号

转载 作者:行者123 更新时间:2023-12-04 10:55:16 25 4
gpt4 key购买 nike

我正在尝试在 R 中创建一个 for 循环,它将 1) 确定负数是一列,2) 将符号翻转为正,3) 然后翻转同一行的选择列的符号(在任一方向),以及然后创建一个因素来识别标志是否被翻转。

下面是一个例子。我希望“z”列中的所有负值都变为正值,然后对于发生这种情况的任何行(第 4-8 行),我希望“y”列中值的符号翻转。

Example <- data.frame(x = 4:-3, y = -4:3, z = 2:-5)

x y z
1 4 -4 2
2 3 -3 1
3 2 -2 0
4 1 -1 -1
5 0 0 -2
6 -1 1 -3
7 -2 2 -4
8 -3 3 -5

for (i in Example$z){
if(sign(i) == -1){
Example$z[i] <- (Example$z[i]*-1)
Example$y[i] <- (Example$y[i]*-1)
Example$Flip[i] <- "True"
}
else{
Example$Flip[i] <- "False"
}
}

但是,这个 for 循环给了我以下内容:
   x  y  z Flip
1 4 -4 2 True
2 3 -3 1 True
3 2 -2 0 True
4 1 -1 -1 True
5 0 0 -2 True
6 -1 -1 3 True
7 -2 -2 4 True
8 -3 -3 5 True

我想让它创建的是:
   x  y  z Flip
1 4 -4 2 False
2 3 -3 1 False
3 2 -2 0 False
4 1 1 1 True
5 0 0 2 True
6 -1 -1 3 True
7 -2 -2 4 True
8 -3 -3 5 True

我在构建这个循环时做错了什么?任何帮助是极大的赞赏!

最佳答案

在 R 中,大多数情况下您无需使用 for 即可逃脱。环形

Example$Flip <- Example$z < 0 
Example$z[Example$Flip] <- -Example$z[Example$Flip]
Example$y[Example$Flip] <- -Example$y[Example$Flip]


Example
# x y z Flip
#1 4 -4 2 FALSE
#2 3 -3 1 FALSE
#3 2 -2 0 FALSE
#4 1 1 1 TRUE
#5 0 0 2 TRUE
#6 -1 -1 3 TRUE
#7 -2 -2 4 TRUE
#8 -3 -3 5 TRUE

使用 dplyr我们可以在一个链式操作中完成这项工作
library(dplyr)

Example %>%
mutate(Flip = z < 0,
z = ifelse(Flip, -z, z),
y = ifelse(Flip, -y, y))

至于您的 for循环担心您正在遍历 z 的值相反,循环应该在 z 的索引上或数据帧的行( 1:nrow(Example) )代替。我对您的代码进行了两项更改,以下内容应该可以正常工作。
Example$Flip = NA

for (i in seq_along(Example$z)){ #Change1
if(sign(Example$z[i]) == -1){ #Change2
Example$z[i] <- (Example$z[i]*-1)
Example$y[i] <- (Example$y[i]*-1)
Example$Flip[i] <- "True"
}
else{
Example$Flip[i] <- "False"
}
}

Example
# x y z Flip
#1 4 -4 2 False
#2 3 -3 1 False
#3 2 -2 0 False
#4 1 1 1 True
#5 0 0 2 True
#6 -1 -1 3 True
#7 -2 -2 4 True
#8 -3 -3 5 True

关于r - For 循环有条件地翻转数据框中值的符号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55095214/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com