2012-07-06 89 views
0

我一直在四處搜索,我無法弄清楚如何在我的數據框中(取決於某些範圍)sumarise數據。我知道在應用daaply/taaply或table的組合時可以完成,但我無法得到我期待的確切結果。根據條件計算數據框中的值

基本上,我想要把這個:

part_no val1 val2 val3 
2 1 2 3 45.3 
2 1 3 4 -12.3 
3 1 3 4 99.3 
3 1 5 2 -3.2 
3 1 4 3 -55.3 

進入這個:

part_no val3_between0_50 val3_bw50_100 val3_bw-50_0 val3_bw-100_-50 
2 1 0 0 1 0 
3 0 1 0 1 1 

這是虛擬數據,我得到了很多更多的行,但這個想法是一樣的。我只想計算符合特定條件的參與者的數值。

如果任何人都可以一步一步解釋它,我會非常感激。我看到很多不同的小帖子,但沒有一個是完全這樣的,我的嘗試只讓我在那裏一半。喜歡使用table

+0

如果您以更容易重新規定的格式提供數據,則其他人可以更快地回答問題。 http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example – 2012-07-06 15:20:45

+0

同時,看看'cut'功能。 – 2012-07-06 15:21:08

+0

@RichieCotton謝謝,我不知道如何格式化問題,所以我只是把代碼塊。 – unixsnob 2012-07-06 15:47:40

回答

2

更好的解決方案,它下面的一個(將不需要下面的但如果你想重命名代碼移動到這個矩陣的結果,你可以使用額外的行):

xtabs(~part_no +cut(val4, breaks=c(-100, -50, 0, 50, 100)), dat=dat) 
#------------- 
     cut(val4, breaks = c(-100, -50, 0, 50, 100)) 
part_no (-100,-50] (-50,0] (0,50] (50,100] 
     2   0  1  1  0 
     3   1  1  0  1 

首先嚐試:.... n稍有不同的問題,很容易適應您的情況。我碰到的困難是我的解決方案需要part_no以1開始。您可以稍後分配行標籤。或者使'part_no'成爲一個因素並使用它的數字模式值。

dat <- read.table(text="part_no val1 val2 val3 val4 
1 1 2 3 -32 
2 1 2 3 45.3 
2 1 3 4 -12.3 
3 1 3 4 99.3 
3 1 5 2 -3.2 
3 1 4 3 -55.3 
", head=T) 

levs= 4; recs <- matrix(c(unique(dat$part_no), 
          rep(0, levs*length(unique(dat$part_no)))), 
         nrow=length(unique(dat$part_no))) 
recs[ cbind(dat$part_no, 
       1+ findInterval(dat$val4, c(-100, -50, 0, 50, 100)))] <- 1 
recs 
#------------------------------------ 
    [,1] [,2] [,3] [,4] [,5] 
[1,] 1 0 1 0 0 
[2,] 2 0 1 1 0 
[3,] 3 1 1 0 1 
#------------------------------------ 
colnames(recs) <- c(names(dat)[1] , 
        paste("val_btwn", 
          c(-100, -50, 0, 50, 100)[1:4], 
          c(-100, -50, 0, 50, 100)[2:5], 
          sep="_")) 
recs 
#------------------------------------ 
    part_no val_btwn_-100_-50 val_btwn_-50_0 val_btwn_0_50 val_btwn_50_100 
[1,]  1     0    1    0    0 
[2,]  2     0    1    1    0 
[3,]  3     1    1    0    1 

而現在,我想我還可以使用cutxtabs下一次。事實上,它工作得很好,我將把它發佈在最前面。

+0

謝謝!它的工作就像一種享受! – unixsnob 2012-07-11 09:59:30