对数据框进行排序并保留主列

时间:2016-11-17 21:44:58

标签: r

我有一个像这样的数据框

   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))]

1 个答案:

答案 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