2016-11-17 35 views
0

我有這樣排序數據幀和保持主山坳

name stock_11 stock_1 stock_2 
    main1 0  4  1 
    main2 2  2  3 
    main3 4  4  8 
    main4 7  7  3 

一個數據幀,我想簡短的DF根據每列的名稱,但保持第一列「名」。對於其他山坳名稱是列「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))] 

回答

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 
+0

謝謝你,如果作品完美。有一個問題,如果它很簡單,可以將它用於像stock_1 price_1 stock_2 price_2這樣的列。我的意思是根據數量進行訂購,我知道colmuns的主要部分是stock_和price_? – Jake

+0

您是否需要維護股票和價格的訂單?例如,股票總是在價格之後。 – JasonWang

+0

是的,這是訂單 – Jake