0

有一点我不明白。我有这个数据框:

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

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

2008-06     0

我遵循了这一点(在数据框中的特定位置添加新行)。第一步:添加索引列;第二步:为每行附加一个索引号;然后,排序。

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)的末尾。显然,数据框尚未排序,尽管它似乎是。

我哪里错了?感谢帮助...

4

2 回答 2

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

结果图。

尽管您必须转换Var1Date, 因为ggplot2不理解yearmon对象。

于 2013-06-03T15:09:55.550 回答
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?

就订单而言,如果您已经有因子(如您所做的那样),则需要重新排序因子。如果您想了解更多详细信息,请参阅此帖子

于 2013-06-03T15:10:47.100 回答