在R

时间:2016-05-14 20:51:08

标签: r graph aggregate grouping aggregation

我有一个包含以下行的CSV文件:

10,130,A,100,1000
10,130,B,200,-200
10,130,C,300,1200
20,140,A,120,1050
20,140,B,220,-300
20,140,C,320,1250
30,120,A,145,1130
30,120,B,255,1000
30,120,C,355,1110
...

依此类推,第一列中的10每行增加三行。对于第3列(A,B和C)中的每种类型,每行在第4列和第5列中包含两个值。第1列和第2列中的值对于每组三行是相同的。

我用以下内容阅读:

data <- read.csv("data_out.csv", header=FALSE, sep=",")

从文件中读取的每组三行包含8个值,可以在图形上绘制为Y(前三行的示例):

  1. 第1栏(10)中的值
  2. 第2栏(130)中的值
  3. 类型A(100)
  4. 的第4列中的值
  5. 类型A(1000)
  6. 的第5列中的值
  7. 类型B(200)
  8. 的第4列中的值
  9. 第5栏中的类型B(-200)
  10. 的值
  11. 类型C(300)
  12. 的第4列中的值
  13. 第5栏中的类型C(1200)
  14. 的值

    它们将被绘制为X = 10。

    因此前8个点将具有以下坐标(X,Y):

    (10,10); (10,130); (10,100); (10,1000); (10,200); (10,-200); (10,300); (10,1200)
    

    第1列中20的后三行将具有坐标:

    (20,20); (20,140); (20,120); (20,1050); (20,220); (20,-300); (20,320); (20,1250)
    

    类似地,输入文件中的第三行和任何其他三行。

    应该连接来自每组三条线的8个值中的每一个的点,以形成折线图similar to this one(但是有8个折线图,而不是示例中的4个)。因此,在同一图表上将有8个折线图表示X = 10,X = 20,X = 30等的值。

    有关解决方案的问题

    我知道如何绘制一条线,例如plot(data[,1],data[,4],type="l")但是如何绘制多条线?

    如何确保Y的0位于正确的位置,以便C5的负值也可以正确绘制?

    另外,我知道有aggregate函数可用于按类型(A,B,C)分组,但我不想执行任何摘要或平均,所以我可能正在寻找一个过滤器(按类型)而不是聚合?

    我可能还想确保C1中的不同值的数量与C2中的相同(纯粹用于验证输入数据是否合适)。

1 个答案:

答案 0 :(得分:1)

考虑到你添加到edit2中的数据,我将再次讨论你的问题。希望您能在解释后解决您的实际问题。

您说从csv中读取的数据框:

df = data.frame(
  c(10,130,"A",100,1000),
  c(10,130,"B",200,-200),
  c(10,130,"C",300,1200),
  c(20,140,"A",120,1050),
  c(20,140,"B",220,-300),
  c(20,140,"C",320,1250),
  c(30,120,"A",145,1130),
  c(30,120,"B",255,1000),
  c(30,120,"C",355,1110))

我们需要将其转换为以列格式转换,您最初在帖子中提到过。

df = data.frame(t(df))

我按照你的例子命名列:

names(df) = c("C1","C2","C3","C4","C5")

将软件包安装并读入R:

install.packages("reshape2")
install.packages("ggplot2")
library(reshape2)
library(ggplot2)

melt将您的数据重新整形为长格式,以帮助您绘制图表。第一个变量C4C5将转换为长格式,并重命名以在图中标识它们。

d1 = melt(df[,c(1,3:5)], id.vars = c("C1","C3"), measure.vars = c("C4","C5"), variable.name = "col")
d1$group = paste0(d1$C3,d1$col)

然后变量C1C2在没有[A,B,C]的情况下融化。

d2 = unique(melt(df[,c(1:2)], id.vars = "C1", measure.vars = c("C1","C2"), variable.name = "group"))

两个融化的数据集都由绘图所需的列组合。

p = rbind(d1[,c("C1","group","value")], d2[,c("C1","group","value")])
p$value = as.numeric(p$value)

您可以绘制,按照您创建的组对线条进行着色以识别它们,然后绘制标签以读取值。

ggplot(p, aes(x=C1, y=value, group=group, color=group, label=value)) + 
  geom_line() + geom_point() + geom_text(aes(label=value, hjust= 1, vjust=-1))

enter image description here