2016-05-29 36 views
1

我目前在學習R,遇到列表數據的問題。在R表函數中結合列

我在數據框中有整數分數,model,範圍從1到10(含)。當我使用表函數,即

table(model$score) 

我得到以下結果:

1 2 3 4 5 6 7 8 9 10 
    5 6 8 7 2 3 6 4 5 0 

不過,我希望能夠製作如下格式的數據:

1-2 3-4 5-6 7-8 9-10 
    11 15 5 10  5 

是它使用表函數可以實現這一點,還是必須尋求其他函數/包的幫助?我該怎麼做呢?有沒有類似prop.table函數的方法?

謝謝你的幫助。

回答

6

爲什麼不簡單地做到這一點?

x <- table(model$score) 
x <- x[c(1,3,5,7,9)] + x[c(2,4,6,8,10)] 
names(x) <- c("1-2","3-4","5-6","7-8","9-10") 

它並沒有引入額外的複雜性。

table當然會給你一個長度爲10的矢量,因爲你有10個獨特的級別。

好吧,如果你堅持叫table()得到你想要的結果,你需要使用cut()對數據進行分類到不同的編號:

set.seed(0); a <- sample(1:10, 200, replace = TRUE) 
table(cut(a, breaks = c(0,2,4,6,8,10))) 

(0,2] (2,4] (4,6] (6,8] (8,10] 
    29  45  43  47  36 

更改標籤?使用labels(內cut()):

table(cut(a, breaks = c(0,2,4,6,8,10), labels = c("1-2","3-4","5-6","7-8","9-10"))) 

1-2 3-4 5-6 7-8 9-10 
    29 45 43 47 36 

但你必須確保a是數值。你會得到錯誤,如果:

a <- factor(a) 
table(cut(a, breaks = c(0,2,4,6,8,10))) 

Error in cut.default(a, breaks = c(0, 2, 4, 6, 8, 10)) : 
    'x' must be numeric 
+0

謝謝您的詳細解答。我想我會堅持你的第一種做法,因爲在這個時候它對我來說簡單但足夠好。我也對剪輯功能一無所知。 –

4

你也使用zoo包,

library(zoo) 
rollapply(table(model$score), 2, by = 2, sum) 

使用@Zheyuan李的例子,(更新按照@ G.Grothendieck的評論)

tt <- rollapply(table(a), 2, by = 2, sum) 
names(tt) <- rollapply(names(table(a)), 2, by = 2, paste, collapse = "-") 
tt 
# 1-2 3-4 5-6 7-8 9-10 
# 29 45 43 47 36 
+1

或者可能再次使用'rollapply'來設置名稱:'names(tt)< - rollapply(names(table(a)),2,by = 2,paste,collapse =「 - 」)' –

+0

Nice one @ G.Grothendieck – Sotos

+0

您的解決方案看起來也很簡單。糾正我,如果我錯了,但功能'rollapply'工作像滑動窗口?據我所知,rollapply通過'by'參數中指定的數字移動滑動窗口,然後執行指定的函數。 –

4

這裏有一個更快的選項RcppRolltabulate

library(RcppRoll) 
nm1 <- do.call(paste, c(as.data.frame(matrix(1:10, ncol=2, byrow=TRUE)), list(sep="-"))) 
setNames(roll_sum(tabulate(a),2)[c(TRUE, FALSE)], nm1) 
# 1-2 3-4 5-6 7-8 9-10 
# 29 45 43 47 36