按列名对数据框的列进行排序

时间:2011-09-07 13:27:51

标签: r sorting dataset

这可能是一个简单的问题,但我不知道如何按字母顺序排列。

test = data.frame(C = c(0, 2, 4, 7, 8), A = c(4, 2, 4, 7, 8), B = c(1, 3, 8, 3, 2))

#   C A B
# 1 0 4 1
# 2 2 2 3
# 3 4 4 8
# 4 7 7 3
# 5 8 8 2

我喜欢按字母顺序按列名排序,以实现

#   A B C
# 1 4 1 0
# 2 2 3 2
# 3 4 8 4
# 4 7 3 7
# 5 8 2 8

对于其他人,我想要自己定义的订单:

#   B A C
# 1 4 1 0
# 2 2 3 2
# 3 4 8 4
# 4 7 3 7
# 5 8 2 8

请注意我的数据集很大,有10000个变量。因此,流程需要更加自动化。

9 个答案:

答案 0 :(得分:107)

您可以在order上使用names,并在子集化时使用它来排序列:

test[ , order(names(test))]
  A B C
1 4 1 0
2 2 3 2
3 4 8 4
4 7 3 7
5 8 2 8

对于您自己定义的订单,您需要定义自己的名称映射到排序。这取决于您希望如何执行此操作,但是使用上面的order交换任何函数都应该提供您想要的输出。

例如,您可以查看Order a data frame's rows according to a target vector that specifies the desired order,即您可以针对包含所需列顺序的目标向量match数据框names

答案 1 :(得分:13)

test = data.frame(C=c(0,2,4, 7, 8), A=c(4,2,4, 7, 8), B=c(1, 3, 8,3,2))

可以使用简单的以下函数替换(但仅当数据框没有很多列时):

test <- test[, c("A", "B", "C")]

其他人:

test <- test[, c("B", "A", "C")]

答案 2 :(得分:9)

这是强制性的dplyr答案,以防有人要使用管道执行此操作。

test %>% 
    select(sort(names(.)))

答案 3 :(得分:3)

  test[,sort(names(test))]

对列名称进行排序可以轻松实现。

答案 4 :(得分:0)

以下是我发现用我的数据集实现类似问题的方法。

首先,做詹姆斯上面提到的,即

test[ , order(names(test))]

其次,使用dplyr中的everything()函数在数据框的开头移动感兴趣的特定列(例如,“D”,“G”,“K”),将字母顺序的列放在那些列之后。

select(test, D, G, K, everything())

答案 5 :(得分:0)

如果您只想在前面放置一列或多列,而不关心其余顺序:

fun updatePetItemsWithNewGender(gender: String?) {
    this@PetViewModel.genderMutableData.postValue("female")
}

答案 6 :(得分:0)

类似于以上其他语法,但需要学习-您可以按列名排序吗?

    @Override
    protected void onNewIntent(Intent intent) {
        super.onNewIntent(intent);
        Log.d(logTag, "Get new intent...");

        String action = intent.getAction();
        String type = intent.getType();

        if(Intent.ACTION_SEND.equals(action) && type != null) {
            if("text/plain".equals(type)) {
                String sharedText = intent.getStringExtra(Intent.EXTRA_TEXT);
                Log.d(logTag, "Get text/plain intent: " + sharedText);
                publishMessage("Oh, a new intent!");
            }
        }

    }

答案 7 :(得分:0)

另一种选择是使用库 stringr 中的str_sort(),并使用参数numeric = TRUE

str_sort(c("V3", "V1", "V10"), numeric = TRUE)

# [1] V1 V3 V11

答案 8 :(得分:0)

因此,首先要有特定的列,然后再按字母顺序排列其余的列,我将提出以下解决方案:

test[, c("myFirstColumn", sort(setdiff(names(test), "myFirstColumn")))]