有些事我不明白。 我有这个数据框:
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)。显然,数据框尚未排序,尽管它似乎是。
我哪里错了?谢谢你的帮助...
答案 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")
虽然您必须将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