根据它们的位置将名称分配给矢量中某些范围的值 [R]
Assigning names to certain ranges of values in vector based on their positions [R]
我有一个存储一些值的数值向量,例如:
vec <- sample(200:800, 20, replace = TRUE)
还有两个数字变量表示该向量中的特定位置,例如:
pos1 <- 6
pos2 <- 12
我想命名给定 vec 中的所有值,它们是 < pos1“front”,values > pos2“end”和这两个坐标“middle”之间的值。
我是 R 的初学者。我知道如何使用多行代码来做到这一点,但我将不胜感激一些更直接、更优化的解决方案。
这是我的代码:
vec <- sample(200:800, 20, replace = TRUE)
positions <- 1:length(vec)
pos1 <- 6
pos2 <- 12
front <- positions[1:pos1-1]
middle <- positions[pos1:pos2]
end <- positions[(pos2+1):length(positions)]
segmentation <- c(rep("front", length(front)), rep("middle", length(middle)), rep("end", length(end)))
vec2 <- vec
vec2 <- setNames(segmentation, vec)
我也知道如何通过创建一个 df 然后提取命名的 vec 来实现这个技巧,但我想避免这种情况。
非常感谢你的帮助。
在您的问题中,您用逻辑描述了您的问题,那么为什么不使用 ifelse()
:
将文字逻辑转换为逻辑呢?
# Create a toy vector with dummy names
vec <- sample(200:800, 20, replace = TRUE)
names(vec) <- 1:length(vec)
# Define criteria for naming
pos1 <- 6
pos2 <- 12
# Use logic to define names in toy vector
names(vec) <- ifelse(as.numeric(names(vec)) < pos1,
yes = "front",
no = ifelse(as.numeric(names(vec)) > pos2,
yes = "back",
no = "middle"))
vec
#> front front front front front middle middle middle middle middle middle
#> 762 205 469 484 653 491 505 432 783 345 366
#> middle back back back back back back back back
#> 664 498 706 248 547 317 695 749 225
Created on 2021-10-20 by the reprex package (v2.0.1)
我有一个存储一些值的数值向量,例如:
vec <- sample(200:800, 20, replace = TRUE)
还有两个数字变量表示该向量中的特定位置,例如:
pos1 <- 6
pos2 <- 12
我想命名给定 vec 中的所有值,它们是 < pos1“front”,values > pos2“end”和这两个坐标“middle”之间的值。
我是 R 的初学者。我知道如何使用多行代码来做到这一点,但我将不胜感激一些更直接、更优化的解决方案。
这是我的代码:
vec <- sample(200:800, 20, replace = TRUE)
positions <- 1:length(vec)
pos1 <- 6
pos2 <- 12
front <- positions[1:pos1-1]
middle <- positions[pos1:pos2]
end <- positions[(pos2+1):length(positions)]
segmentation <- c(rep("front", length(front)), rep("middle", length(middle)), rep("end", length(end)))
vec2 <- vec
vec2 <- setNames(segmentation, vec)
我也知道如何通过创建一个 df 然后提取命名的 vec 来实现这个技巧,但我想避免这种情况。
非常感谢你的帮助。
在您的问题中,您用逻辑描述了您的问题,那么为什么不使用 ifelse()
:
# Create a toy vector with dummy names
vec <- sample(200:800, 20, replace = TRUE)
names(vec) <- 1:length(vec)
# Define criteria for naming
pos1 <- 6
pos2 <- 12
# Use logic to define names in toy vector
names(vec) <- ifelse(as.numeric(names(vec)) < pos1,
yes = "front",
no = ifelse(as.numeric(names(vec)) > pos2,
yes = "back",
no = "middle"))
vec
#> front front front front front middle middle middle middle middle middle
#> 762 205 469 484 653 491 505 432 783 345 366
#> middle back back back back back back back back
#> 664 498 706 248 547 317 695 749 225
Created on 2021-10-20 by the reprex package (v2.0.1)