在 R 中以数学方式操作 vector/object 的特定元素

mathematically manipulate specific elements of vector/object in R

我想知道如何从向量中大于我设置的阈值的元素中减去特定值?

例如,如果我的数据定义为:

numbers = 1:500
data=  sample(numbers)

我现在有一个 1 到 500 之间的随机数字列表。

我现在想从此向量中大于 200 的每个值中减去 360。从逻辑上讲,我想编写一个带有 if 语句的 for 循环来执行此操作。我已经编写了如下所示的代码:

for (i in 1:length(data)) {
       if data[i]>200 {
       data[] - 360
     } else {
       data[] - 0
     }
}

这显然行不通,但我对如何实现我的目标感到困惑。因为之后我需要绘制这些数据,所以我需要它们在输出向量中保持原来的顺序。非常感谢您的帮助!

我会使用 ifelse

numbers = 1:500
data=  sample(numbers)

new_numbers <- ifelse(numbers >200,numbers-360, numbers)
new_numbers

好吧,一个简单的答案就是这个

x[x>200] = x[x>200] - 360
  1. x>200: return 一个逻辑向量,每个大于 200 的值都是 TRUE,其他值是 FALSE
  2. 使用逻辑向量访问初始向量的元素。仅分配或访问逻辑向量中具有 TRUE 值的元素

您的代码是错误的,因为您使用了错误的运算符 [。它必须抛出一个错误。

for (i in 1:length(data)) { 
    if (data[i]>200) { 
        data[i] = data[i] - 360
    }
}

这是正确的方法。您必须从头开始阅读 R 才能更好地理解运算符...

ifelse() 非常适合这个目的,您可以使用样本的数据向量:

data <- ifelse( data > 200, data - 360, data )

所以只是为了换一种口味:

set.seed( 1110 )                                      # make it reproducible
data <- sample( numbers )
head( data, 10 )
[1] 242 395 440 287 110  46 241 489 276 178
data[ data > 200 ] <- data[ data > 200 ] - 360        # replace inline
head( data )
[1] -118   35   80  -73  110   46 -119  129  -84  178

你的循环在更正一些错误后也能正常工作,见下文:

for (i in 1:length(data)) {
        if( data[i]>200 ){
        data[ i ] <- data[ i ] - 360}
}

不需要使用循环。这是最简单的方法-

data <- data - 360*(data > 200)

演示 -

set.seed(1)
numbers <- 1:500
data <- sample(numbers)

head(data)
# [1] 133 186 286 452 101 445

data <- data - 360*(data > 200)

head(data)
# [1] 133 186 -74  92 101  85