2011-10-04 128 views
2

鄉親操作執行列逐列R中

我有一個溫度數據的建築物不斷區,像這樣:

Lines <- "Date,Zone01,Zone02 
01/01 01:00:00,24.5,21.3 
01/01 02:00:00,24.3,21.1 
01/01 03:00:00,24.1,21.1 
01/01 04:00:00,24.1,20.9 
01/01 05:00:00,25.,21. 
01/01 06:00:00,26.,21. 
01/01 07:00:00,26.6,22.3 
01/01 08:00:00,28.,24. 
01/01 09:00:00,28.9,26.5 
01/01 10:00:00,29.4,29 
01/01 11:00:00,30.,32. 
01/01 12:00:00,33.,35. 
01/01 13:00:00,33.4,36 
01/01 14:00:00,35.8,38 
01/01 15:00:00,32.3,37 
01/01 16:00:00,30.,34. 
01/01 17:00:00,29.,33. 
01/01 18:00:00,28.,32. 
01/01 19:00:00,26.3,30 
01/01 20:00:00,26.,28. 
01/01 21:00:00,25.9,25 
01/01 22:00:00,25.8,21.3 
01/01 23:00:00,25.6,21.4 
01/01 24:00:00,25.5,21.5 
01/02 01:00:00,25.4,21.6 
01/02 02:00:00,25.3,21.8" 

我想要做的是計算第99每個區域的溫度百分位數。我會做這個命令:

Q=quantile(Lines$Zone01,0.99) 

但是,然後我將不得不手動爲數據集中的每一列做手動。有沒有辦法讓這個命令遍歷所有的列(從第二列開始)?

非常感謝。

回答

7

apply家庭使用的功能,在這種情況下sapply

> sapply(Lines[, -1], quantile, 0.99) 
Zone01.99% Zone02.99% 
    35.20  37.75 

你會發現,這樣做的效果是,quantile被追加到列名。要刪除此,通過names=FALSE作爲參數傳遞給quantile

> sapply(Lines[, -1], quantile, 0.99, names=FALSE) 
Zone01 Zone02 
35.20 37.75 
+0

作品般的魅力。我只需選擇溫度欄,例如第2列直到33行[,2:33]。 – ery

+0

@ery您可以這樣做,或者在我的回答中使用'Lines [,-1]' - 這意味着刪除第一列。 – Andrie

3

假設你的數據在一個data.frame你可以在列隨着溫度的數據轉換爲基體,並使用apply(matrix,2,quantile,0.99)

5

plyr有一個名爲numcolwise的漂亮功能,如果它是數字,它將在數據框的每一列上操作。例如:

library(plyr) 
> numcolwise(function(x) quantile(x, .99))(dat) 
    Zone01 Zone02 
99% 35.2 37.75 

應該這樣做。

當然,你可以隨時使用基本適用家庭:

> apply(dat[, -1], 2, function(x) quantile(x, .99)) 
Zone01 Zone02 
35.20 37.75