在排序数据框中添加一行:哪些解决方案?

时间:2013-06-03 15:01:20

标签: r dataframe

有些事我不明白。 我有这个数据框:

    Var1        Freq
1   2008-05     1
2   2008-07     7
3   2008-08     5
4   2008-09     3

我需要在第二个位置附加一行,例如:

2008-06     0

我遵循了这个(Add a new row in specific place in a dataframe)。第一步:添加索引列;第二步:追加每个行的索引号;然后,排序。

df$ind <- seq_len(nrow(df))
df <- rbind(df,data.frame(Var1 = "2008-06", Freq = "0",ind=1.1))
df <- df[order(df$ind),]

好的,一切似乎都很好。即使我不知道为什么会出现一个名为“row.names”的列,我得到:

    row.names   Var1       Freq   ind
 1      1       2008-05     1      1 
 2      5       2008-06     0      1.1
 3      2       2008-07     7      2
 4      3       2008-08     5      3
 5      4       2008-09     3      4

现在,我用ggplot2绘制它。

ggplot(df, aes(y = Freq, x = Var1)) + geom_bar()

我们在这里。在X轴上,“2008-06”位于“2008-09”之后(即索引为5)。显然,数据框尚未排序,尽管它似乎是。

我哪里错了?谢谢你的帮助...

2 个答案:

答案 0 :(得分:2)

试试这个:

df$Var1 <- factor(df$Var1, df$Var1[order(df$ind)])

如果您希望ggplot2订购标签,您必须自己指定订单。

您可能还希望将Var1转换为某种日期类,然后完全取消索引变量。我认为这会让事情更加清晰。 zoo包实际上有一个很好的类来表示给定年份的月份,你可以将它用于Var1。例如:

library(zoo)
df$Var1 <- as.yearmon(df$Var1)
df <- rbind(df,data.frame(Var1 = as.yearmon("2008-06"), Freq = "0"))

现在您可以按Var1订购数据框,而无需担心保留索引:

> df[order(df$Var1), ]
      Var1 Freq
1 May 2008    1
5 Jun 2008    0
2 Jul 2008    7
3 Aug 2008    5
4 Sep 2008    3

ggplot2中的情节将按预期结束:

ggplot(df, aes(as.Date(Var1), Freq)) + geom_bar(stat="identity")

The resulting plot.

虽然您必须将Var1转换为Date,但由于ggplot2无法理解yearmon个对象。

答案 1 :(得分:1)

这是因为在某个方面,你有一个混合因素。这会产生你想要的东西(没有rownames列):

df <- read.table(text="    Var1        Freq
1   2008-05     1
2   2008-07     7
3   2008-08     5
4   2008-09     3", header=TRUE, stringsAsFactors = FALSE)

df$ind <- seq_len(nrow(df))
df <- rbind(df,data.frame(Var1 = "2008-06", Freq = "0",ind=1.1, stringsAsFactors = FALSE))
df <- df[order(df$ind),]

ggplot(df, aes(y = Freq, x = Var1)) + geom_bar()

请注意stringsAsFactors = FALSE

如果你已经有了因素(如你所做的那样),那么你需要对因子进行重新排序。如果您需要更详细的信息,请参阅this post