在 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
x>200
: return 一个逻辑向量,每个大于 200 的值都是 TRUE,其他值是 FALSE
- 使用逻辑向量访问初始向量的元素。仅分配或访问逻辑向量中具有 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
我想知道如何从向量中大于我设置的阈值的元素中减去特定值?
例如,如果我的数据定义为:
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
x>200
: return 一个逻辑向量,每个大于 200 的值都是 TRUE,其他值是 FALSE- 使用逻辑向量访问初始向量的元素。仅分配或访问逻辑向量中具有 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