我有一个像这样的数据框
name stock_11 stock_1 stock_2
main1 0 4 1
main2 2 2 3
main3 4 4 8
main4 7 7 3
我想根据每个列的名称缩短df,但首先保留列" name"。对于其他col名称,它是列" stock _"
我试图得到的输出结果是:
name stock_1 stock_2 stock_11
main1 4 1 0
main2 2 3 2
main3 4 8 4
main4 7 3 7
我尝试了这个,但它排序了所有名字:
df[ , order(names(df))]
答案 0 :(得分:2)
如果你有很多专栏
df[, c(1, order(as.numeric(gsub("[^0-9]+", "", names(df)[-1]))) + 1)]
name stock_1 stock_2 stock_11
1 main1 4 1 0
2 main2 2 3 2
3 main3 4 8 4
4 main4 7 3 7
正如您在评论中提到的,如果您可以接受价格和库存不一致的订单,此解决方案仍然有效。这是一个例子:
# Example
df
name price_2 price_1 stock_2 stock_1 stock_11 price_11
1 main1 1 4 1 4 0 0
2 main2 3 2 3 2 2 2
3 main3 8 4 8 4 4 4
4 main4 3 7 3 7 7 7
# Solution
# Note that the order of stock and price is not consistent
df[, c(1, order(as.numeric(gsub("[^0-9]+", "", names(df)[-1]))) + 1)]
name price_1 stock_1 price_2 stock_2 stock_11 price_11
1 main1 4 4 1 1 0 0
2 main2 2 2 3 3 2 2
3 main3 4 4 8 8 4 4
4 main4 7 7 3 3 7 7
以下是解决这个问题的方法:
df1 <- df[c(names(df)[1], sort(names(df)[-1], decreasing=TRUE))]
df1[, c(1, order(as.numeric(gsub("[^0-9]+", "", names(df1)[-1]))) + 1)]
name stock_1 price_1 stock_2 price_2 stock_11 price_11
main1 4 4 1 1 0 0
main2 2 2 3 3 2 2
main3 4 4 8 8 4 4
main4 7 7 3 3 7 7