在R中分组数据

时间:2012-03-14 18:38:32

标签: r

我有这个数据框,这是一个日常数据。对于每一天,我都有每个文件系统的可用空间。我喜欢这个图。我想将每个文件系统放在自己的列上以创建R图。我怎么能这样做呢。如果不将它们移动到自己的列中,我可以为每天的每个文件系统创建一个图表吗?

     Date     fileSystem FreeSpace
2011-12-03     /var          99.785
2011-12-03     /opt          30.494
2011-12-03     /tmp          55.643
2011-12-03     /data         37.846
2011-12-03     /ora          0.578
2011-12-04     /var          99.785
2011-12-04     /opt          30.494
2011-12-04     /tmp          55.643
2011-12-04    /data         37.846
2011-12-04     /ora          0.578

3 个答案:

答案 0 :(得分:2)

R中有很多种可能性......这样的事情? 但是,如果你想每天为每个文件系统进行绘图,那么只有一个吧(如果它非常有用的话,请不要这样做......)。

df <- read.table(header = TRUE, text = "Date     fileSystem FreeSpace
                 2011-12-03     /var          99.785
                 2011-12-03     /opt          30.494
                 2011-12-03     /tmp          55.643
                 2011-12-03     /data         37.846
                 2011-12-03     /ora          0.578
                 2011-12-04     /var          99.785
                 2011-12-04     /opt          30.494
                 2011-12-04     /tmp          55.643
                 2011-12-04    /data         37.846
                 2011-12-04     /ora          0.578
                 ")

## using ggplot (dates are faceted)
require(ggplot2)
ggplot(df, aes(x = fileSystem, y = FreeSpace)) +
  geom_bar() +
  facet_wrap(~Date)

enter image description here

修改 或者作为折线图。 R中几乎所有东西都是可能的,但你必须考虑你想要的那种情节......

df$Date <- strptime(df$Date, format="%Y-%m-%d")
ggplot(df, aes(x = Date, y = FreeSpace)) +
  geom_line() +
  facet_wrap(~fileSystem)

enter image description here

<强> EDIT2: Perhabs这个?在这里,我为每个带有for循环的文件系统制作一个图。这些图存储在一个列表中。

# or as a line chart
df$Date <- strptime(df$Date, format="%Y-%m-%d")
plotlist <- vector(mode="list", length(levels(df$fileSystem)))
for(i in levels(df$fileSystem)){
  tempdf <- df[df$fileSystem == i, ]
  plotlist[[i]] <- ggplot(tempdf, aes(x = Date, y = FreeSpace)) +
    geom_line() +
    opts(title = i)
}
plotlist[["/data"]]
plotlist[["/var"]]

答案 1 :(得分:2)

使用lattice :: xyplot,你有很多选择:

require(lattice)
xyplot(FreeSpace ~ Date + fileSystem, data=df1)
xyplot(FreeSpace ~ Date | fileSystem, data=df1)
xyplot(FreeSpace ~ Date , group= fileSystem, data=df1)
xyplot(FreeSpace ~ Date , group= fileSystem, data=df1, type="b")

基础barplot的点阵等价物为barchart

barchart(FreeSpace ~ Date | fileSystem, data=df1)

答案 2 :(得分:1)

您的数据很难以该格式读取;这是一个可重现的版本:

DF <-
structure(list(Date = structure(c(15311, 15311, 15311, 15311, 
15311, 15312, 15312, 15312, 15312, 15312), class = "Date"), fileSystem = structure(c(5L, 
2L, 4L, 1L, 3L, 5L, 2L, 4L, 1L, 3L), .Label = c("/data", "/opt", 
"/ora", "/tmp", "/var"), class = "factor"), FreeSpace = c(99.785, 
30.494, 55.643, 37.846, 0.578, 99.785, 30.494, 55.643, 37.846, 
0.578)), .Names = c("Date", "fileSystem", "FreeSpace"), row.names = c(NA, 
-10L), class = "data.frame")

我还会展示ggplot2的示例:

library("ggplot2")
library("scales")

这使用网格刻面而不是像@ EDi的答案那样包装。一个不比另一个更正确;这取决于你想要什么。

ggplot(DF, aes(x=Date, y=FreeSpace)) +
  geom_point() +
  geom_line() +
  scale_x_date(breaks=date_breaks("1 day")) +
  facet_grid(fileSystem~.)

enter image description here

您的另一个问题是如何重塑数据。

library("reshape2")

DF.wide <- dcast(DF, Date~fileSystem, value.var="FreeSpace")

给出了

> DF.wide
        Date  /data   /opt  /ora   /tmp   /var
1 2011-12-03 37.846 30.494 0.578 55.643 99.785
2 2011-12-04 37.846 30.494 0.578 55.643 99.785

可以根据需要绘制单个列。