安排ggplot的数据框格式 - R

时间:2017-11-08 12:00:57

标签: r dataframe ggplot2 data.table

我想将数据从宽格式转换为长格式,以便我可以使用ggplot创建图形。我有一些问题,以正确地arragne数据。到目前为止,我使用27个数据帧列表开始我的流程(只显示前10个数据帧):

> str(NDVI_stat)
List of 27
 $ :'data.frame':   10 obs. of  2 variables:
  ..$ NDVI 1 mean: num [1:10] 0.1796 0.3105 0.1422 0.0937 0.1711 ...
  ..$ NDVI 1 sd  : num [1:10] 0.1117 0.05845 0.00743 0.02754 0.01506 ...
 $ :'data.frame':   10 obs. of  2 variables:
  ..$ NDVI 2 mean: num [1:10] 0.0819 0.5954 0.1328 0.0953 0.1492 ...
  ..$ NDVI 2 sd  : num [1:10] 0.00872 0.10508 0.00863 0.01878 0.02303 ...
 $ :'data.frame':   10 obs. of  2 variables:
  ..$ NDVI 3 mean: num [1:10] 0.0634 0.681 0.2108 0.0151 0.179 ...
  ..$ NDVI 3 sd  : num [1:10] 0.0344 0.076 0.0361 0.0638 0.0428 ...
 $ :'data.frame':   10 obs. of  2 variables:
  ..$ NDVI 4 mean: num [1:10] 0.0971 0.6885 0.2326 0.1157 0.3219 ...
  ..$ NDVI 4 sd  : num [1:10] 0.00991 0.07509 0.02054 0.02793 0.0303 ...
 $ :'data.frame':   10 obs. of  2 variables:
  ..$ NDVI 5 mean: num [1:10] 0.0817 0.4825 0.2754 0.1003 0.4155 ...
  ..$ NDVI 5 sd  : num [1:10] 0.00998 0.05034 0.02781 0.03248 0.04056 ...
 $ :'data.frame':   10 obs. of  2 variables:
  ..$ NDVI 6 mean: num [1:10] 0.1119 0.7667 0.582 0.0997 0.4426 ...
  ..$ NDVI 6 sd  : num [1:10] 0.023 0.0672 0.0649 0.0331 0.0557 ...
 $ :'data.frame':   10 obs. of  2 variables:
  ..$ NDVI 7 mean: num [1:10] 0.1997 0.6567 0.5111 0.0988 0.3307 ...
  ..$ NDVI 7 sd  : num [1:10] 0.0671 0.0756 0.0435 0.0288 0.0457 ...
 $ :'data.frame':   10 obs. of  2 variables:
  ..$ NDVI 8 mean: num [1:10] 0.3626 0.7356 0.6304 0.0954 0.335 ...
  ..$ NDVI 8 sd  : num [1:10] 0.1454 0.0888 0.0502 0.0298 0.038 ...
 $ :'data.frame':   10 obs. of  2 variables:
  ..$ NDVI 9 mean: num [1:10] 0.541 0.748 0.637 0.089 0.577 ...
  ..$ NDVI 9 sd  : num [1:10] 0.0968 0.0721 0.0396 0.0276 0.0656 ...
 $ :'data.frame':   10 obs. of  2 variables:
  ..$ NDVI 10 mean: num [1:10] 0.6691 0.4377 0.6713 0.0942 0.6827 ...
  ..$ NDVI 10 sd  : num [1:10] 0.088 0.0698 0.033 0.0316 0.0688 ...
 $ :'data.frame':   10 obs. of  2 variables:

我正在使用rbindlist中的data.table package将所有内容合并为一个dataframe

newdf<-rbindlist(NDVI_stat, use.names = TRUE, fill = TRUE)

代码工作正常,但我没有创建我真正需要的结构。输出为dataframe,包含270个(27个daframes *每行10行)观测值和54个变量(27个数据帧*每列2列)

image of newdf

正如您在图像newdf中看到的那样,它创建了270行,但我想要获得的是10行(因此请避免使用NA值)

对此有何帮助?

这个问题与此类似 Plot dataframe with ggplot2 - R

不同之处在于我改变了我输入的方式并知道我不知道如何正确安排数据框以供日后使用

NDVIdf_forplot <- gather(NDVIdf, key = statistic, value = value, -ID)

然后使用ggplot创建我的图表

对此有何帮助?

2 个答案:

答案 0 :(得分:1)

问题是变量名在列表的每个df中是不同的。一旦解决了,剩下的就像你想象的那样。

dplyr / tidyr的一个例子:

df1<-data.frame(mean1=c(2,3),
                sd1 = c(1,2))

df2<-data.frame(mean2=c(4,5),
                sd2 = c(3,4))

listdf<-list(df1,df2)
str(listdf)

给出

List of 2

 $ :'data.frame':   2 obs. of  2 variables:

  ..$ mean1: num [1:2] 2 3

  ..$ sd1  : num [1:2] 1 2

 $ :'data.frame':   2 obs. of  2 variables:

  ..$ mean2: num [1:2] 4 5

  ..$ sd2  : num [1:2] 3 4

重命名所有数据框并逐行将它们绑定在一起

library(tidyverse)


listdf%>%map(function(x){x%>%rename_(mean = names(x)[1],
                                     sd = names(x)[2])})%>%
  bind_rows()

给出

  mean sd

    2  1

    3  2

    4  3

    5  4

答案 1 :(得分:1)

我想你问的是如何对矩阵进行列绑定。据我所知,data.table没有cbindlist函数,所以你可以尝试:do.call("cbind", NDVI_stat)虽然这不完全相同但如果你没有每个数据帧中的行数相等。