使用gather()进行密钥排序与原始列的排序

时间:2016-04-13 08:20:07

标签: r dataframe tidyr

密钥排序是否取决于我是否首先列出列以收集

这是我的data.frame:

String()

首先,我按照特定顺序收集所有列,并且在键列表中将我的排序视为 second,first ,尽管这些列实际上是以第一个,第二个:

library(tidyr)
wide_df <- data.frame(c("a", "b"), c("oh", "ah"), c("bla", "ble"), stringsAsFactors = FALSE)
colnames(wide_df) <- c("first", "second", "third")
wide_df

 first second third
1     a     oh   bla
2     b     ah   ble

然后我决定从收集中排除一列:

long_01_df <- gather(wide_df, my_key, my_value, second, first, third)
long_01_df

  my_key my_value
1 second       oh
2 second       ah
3  first        a
4  first        b
5  third      bla
6  third      ble

键再次按秒排序,第一个。然后我像这样编码,相信做同样的事情:

long_02_df <- gather(wide_df, my_key, my_value, second, first, -third)
long_02_df

 third my_key my_value
1   bla second       oh
2   ble second       ah
3   bla  first        a
4   ble  first        b

我根据原始data.frame中的实际列顺序获取了键:

long_03_df <- gather(wide_df, my_key, my_value, -third, second, first)
long_03_df

当我使用 third my_key my_value 1 bla first a 2 ble first b 3 bla second oh 4 ble second ah 调用该函数时,此行为甚至不会更改。我错过了什么?

1 个答案:

答案 0 :(得分:2)

摘要

这样做的原因是你不能混合负指数和正指数。 (你也不应该:它根本没有意义。)如果你这样做,gather()将忽略一些索引。

详细答案

同样对于标准索引,您不能混合正面和负面指数:

x <- 1:10
x[c(4, -2)]
## Error in x[c(4, -2)] : only 0's may be mixed with negative subscripts

这是有道理的:使用4进行索引会告诉R只保留第四个元素。没有必要明确告诉它另外抛弃第二个元素。

根据gather()的文档,选择列的工作方式与dplyr的select()相同。那就让我们玩吧。我将使用mtcars的一部分:

mtcars <- mtcars[1:2, 1:5]
mtcars
##                mpg cyl disp  hp drat
## Mazda RX4     21.0   6  160 110 3.90
## Mazda RX4 Wag 21.0   6  160 110 3.90

您可以对select()使用正面和负面索引:

select(mtcars, mpg, cyl)
##              mpg cyl
## Mazda RX4      21   6
## Mazda RX4 Wag  21   6

select(mtcars, -mpg, -cyl)
##               disp  hp drat
## Mazda RX4      160 110  3.9
## Mazda RX4 Wag  160 110  3.9

同样对于select(),混合正负指数是没有意义的。但select()似乎忽略了与第一个符号不同的所有索引,而不是抛出错误:

select(mtcars, mpg, -hp, cyl)
##               mpg cyl
## Mazda RX4      21   6
## Mazda RX4 Wag  21   6

select(mtcars, -mpg, hp, -cyl)
##               disp  hp drat
## Mazda RX4      160 110  3.9
## Mazda RX4 Wag  160 110  3.9

如您所见,结果与之前完全相同。

对于gather()的示例,您可以使用以下两行:

long_02_df <- gather(wide_df, my_key, my_value, second, first, -third)
long_03_df <- gather(wide_df, my_key, my_value, -third, second, first)

根据我上面所示,这些行与:

相同
long_02_df <- gather(wide_df, my_key, my_value, second, first)
long_03_df <- gather(wide_df, my_key, my_value, -third)

请注意,第二行中没有任何内容表示您首选的键排序。它只说third应该省略。