gpt4 book ai didi

将 data.frame 中的指定列按升序重新排序

转载 作者:行者123 更新时间:2023-12-02 07:55:21 25 4
gpt4 key购买 nike

我有一个简短的问题,如何仅针对选定的列名重新排序数据框。我在这里需要一个通用的解决方案,因为我必须在改变 V 列的数量时使用它(每次 V 列 >100)

示例:

假设我有数据:

dkk <- structure(list(A = 2L, X = 3L, C = 4L, D = 5L, Z = 6L, V1 = 5L, 
V6 = 5L, V4 = 5L, V5 = 5L, V3 = 2L, V2 = 2L), .Names = c("X",
"B", "C", "D", "Z", "V1", "V6", "V4", "V5", "V3", "V2"),
class = "data.frame", row.names = c(NA, -1L))

# X B C D Z V1 V6 V4 V5 V3 V2
2 3 4 5 6 5 5 5 5 2 2

如何使用 V 对列重新排序,以便它们按升序排列:

# X B C D Z V1 V2 V3 V4 V5 V6
2 3 4 5 6 5 2 2 5 5 5

非常感谢!!

最佳答案

这是一个更快的选项,使用data.table中的setcolorder

library(data.table)
i1 <- grep("V\\d+", names(dkk), value = TRUE)
cbind(dkk[setdiff(names(dkk), i1)], setcolorder(dkk[i1], order(i1))[])
# A B C D Z V1 V2 V3 V4 V5 V6
#1 2 3 4 5 6 5 2 2 5 5 5
<小时/>

当“V”名称与其他列混合时,这会变得有点复杂,例如,假设我们将列名称更改为

set.seed(24)
names(dkk) <- sample(names(dkk))
dkk
# D C V6 Z V4 V1 B V2 V3 A V5
#1 2 3 4 5 6 5 5 5 5 2 2

现在,选项是使用“V”(“i2”)创建这些列的数字索引,提取名称(“i3”)并分别分配名称和列的顺序

i2 <- grep("^V\\d+", names(dkk))
i3 <- names(dkk)[i2]
names(dkk)[i2] <- sort(names(dkk)[i2])
dkk[i2] <- dkk[i2][order(i3)]

获取

dkk
# D C V1 Z V2 V3 B V4 V5 A V6
#1 2 3 5 5 5 5 5 6 2 2 4

更新

上述解决方案中存在一个问题。当我们的列名称的数字大于 9(即“V10”、“V11”等)时,它无法正确排序。假设我们的第三列名称是“V100”

colnames(dkk)[3] <- "V100"   
dkk
# D C V100 Z V4 V1 B V2 V3 A V5
#1 2 3 4 5 6 5 5 5 5 2 2

i2 <- grep("^V\\d+", names(dkk))
i3 <- names(dkk)[i2]

我们可以用parse_number解析数字部分来辅助排序

i4 <- readr::parse_number(i3)
names(dkk)[i2] <- i3[order(i4)]
dkk[i2] <- dkk[i2][order(i4)]
dkk
# D C V1 Z V2 V3 B V4 V5 A V100
#1 2 3 5 5 5 5 5 6 2 2 4

数据

dkk <- structure(list(A = 2L, B = 3L, C = 4L, D = 5L, E = 6L, V1 = 5L,
V6 = 5L, V4 = 5L, V5 = 5L, V3 = 2L, V2 = 2L), .Names = c("A",
"B", "C", "D", "Z", "V1", "V6", "V4", "V5", "V3", "V2"),
class = "data.frame", row.names = c(NA, -1L))

关于将 data.frame 中的指定列按升序重新排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43598517/

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