2013-04-16 68 views
1

我對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) 

箱線圖(divingmeans)在X軸上提供1:10,在Y軸上提供%0-30。但是,我更喜歡直方圖,以及提供分類箱名稱的x軸(例如avg3或X3),而不僅僅是等級1:10。

HIST()和圖()提供以下信息:

> 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

您想如何繪製它們?

# grab the means of each column 
diving.means <- colMeans(diving[, -(1:5)]) 


# plot it 
plot(diving.means) 

# boxplot 
boxplot(diving.means) 

如果youd喜歡搶下界從列名的間隔,siply除掉那些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) 
+0

感謝您的建議,夥計們!這似乎是以一種非常直接的方式來實現的。然後,我可以很容易地通過[which()]命令在每日時間段內將其分解。非常感激! – stewart6

2

我想你會發現它更容易對付長格式的數據。

您可以使用reshapereshape。我將使用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') 

enter image description here

您現在可以通過日期/小時/次的任意組合進行分析,在深度