我对 R 相当新,但我解决了比当前问题更大的挑战,这使得它特别令人沮丧。我在论坛上搜索并找到了一些相关的主题,但是没有人能够解决这种情况。
我有一个包含14个变量的184个观测值的数据集:
> head(diving)
tagID ddmmyy Hour.GMT. Hour.Local. X0 X3 X10 X20 X50 X100 X150 X200 X300 X400
1 122097 250912 0 9 0.0 0.0 0.3 12.0 15.3 59.6 12.8 0.0 0 0
2 122097 260912 0 9 0.0 2.4 6.9 5.5 13.7 66.5 5.0 0.0 0 0
3 122097 260912 6 15 0.0 1.9 3.6 4.1 12.7 39.3 34.6 3.8 0 0
4 122097 260912 12 21 0.0 0.2 5.5 8.0 18.1 61.4 6.7 0.0 0 0
5 122097 280912 6 15 2.4 9.3 6.0 3.4 7.6 21.1 50.3 0.0 0 0
6 122097 290912 18 3 0.0 0.2 1.6 6.4 41.4 50.4 0.0 0.0 0 0
这是标记数据,每个日期具有一个或多个6小时时间段(由于传输中断而不是连续数据集)。在每个6小时的垃圾箱中,动物潜入的深度按百分比分解为10个垃圾箱。所以X0 =在0-3m之间花费的时间的百分比,X3 =在3-10m之间花费的时间的百分比,等等。
我想为初学者做的是在每个深度箱中花费的平均时间百分比并绘制它。首先,我做了以下几点:
avg0<-mean(diving$X0)
avg3<-mean(diving$X3)
avg10<-mean(diving$X10)
avg20<-mean(diving$X20)
avg50<-mean(diving$X50)
avg100<-mean(diving$X100)
avg150<-mean(diving$X150)
avg200<-mean(diving$X200)
avg300<-mean(diving$X300)
avg400<-mean(diving$X400)
此时,我不确定如何绘制最终的方法,所以我把它们列为一个清单:
divingmeans<-list(avg0, avg3, avg10, avg20, avg50, avg100, avg150, avg200, avg300, avg400)
boxplot(divingmeans)有点工作,在X轴上提供1:10,在y轴上提供%0-30。但是,我更喜欢直方图,以及提供分类bin名称(例如avg3或X3)的x轴,而不仅仅是1:10的等级。
hist()和plot()提供以下内容:
> plot(divingmeans)
Error in xy.coords(x, y, xlabel, ylabel, log) :
'x' is a list, but does not have components 'x' and 'y'
> hist(divingmeans)
Error in hist.default(divingmeans) : 'x' must be numeric
我也尝试过:
> df<-as.data.frame(divingmeans)
> df
X3.33097826086957 X3.29945652173913 X8.85760869565217 X17.6461956521739 X30.2614130434783
1 3.330978 3.299457 8.857609 17.6462 30.26141
X29.3565217391304 X6.44510869565217 X0.664130434782609 X0.135869565217391 X0.0016304347826087
1 29.35652 6.445109 0.6641304 0.1358696 0.001630435
和
> df <- data.frame(matrix(unlist(divingmeans), nrow=10, byrow=T))
> df
matrix.unlist.divingmeans...nrow...10..byrow...T.
1 3.330978261
2 3.299456522
3 8.857608696
4 17.646195652
5 30.261413043
6 29.356521739
7 6.445108696
8 0.664130435
9 0.135869565
10 0.001630435
这两者都没有提供我正在寻找的那种表格。
我知道必须有一个非常基本的解决方案才能将其转换为合适的表格,但我无法弄清楚我的生活。我希望能够制作一个基本的直方图,显示平均每个潜水箱所花费的时间百分比。对于此目的而言,数据的最佳格式似乎是具有两列的表:col1 = bin(类别;例如avg50),col2 =%(数字;表示在该类别中花费的时间百分比)。
您还会注意到数据被分解为不同的时间段;最终,我希望能够按时间分离数据,以查看,例如,平均潜水深度是否在白天/夜晚之间转换,等等。我想,一旦我完成了这个初始代码,我就可以通过选择X0[which(Hour.GMT.=="6")]
来按时间进行相同的操作。这方面的提示也非常受欢迎。
答案 0 :(得分:2)
我认为你会发现以长格式处理数据要容易得多。
您可以reshape
使用reshape
。我将使用data.table来说明如何轻松地按组计算均值。
library(data.table)
DT <- data.table(diving)
DTlong <- reshape(DT, varying = list(5:14), direction = 'long',
times = c(0,3,10,20,50,100,150,200,300,400),
v.names = 'time.spent', timevar = 'hours')
timeByHours <- DTlong[,list(mean.time = mean(time.spent)),by=hours]
# you can then plot the two column data.table
plot(timeByHours, type = 'l')
您现在可以通过深度日期/小时/时间的任意组合进行分析
答案 1 :(得分:0)
你想如何策划它们?
# grab the means of each column
diving.means <- colMeans(diving[, -(1:5)])
# plot it
plot(diving.means)
# boxplot
boxplot(diving.means)
如果您想从列名称中获取间隔的下限,请将X条剥离掉
lowerIntervalBound <- gsub("X", "", names(diving)[-(1:5)])
# you can convert these to numeric and plot against them
lowInts <- as.numeric(lowerIntervalBound)
plot(x=lowInts, y=diving.means)
# ... or taking log
plot(x=log(lowInts), y=diving.means)
# ... or as factors (similar to basic plot)
plot(x=factor(lowInts), y=diving.means)
而不是将潜水方式放在list
中,请尝试将它们放入vector
(使用c
)。
如果要将其合并到data.frame:
data.frame(lowInts, diving.means)
# or adding a row id if needed.
data.frame(rowid=seq(along=diving.means), lowInts, diving.means)