2011-12-23 43 views
1

我有幾個組,我們說A,B,C和我想cut基於這些組的另一個變量,即每個組對同一個變量都有特定的中斷。在tapply中更改參數?

如果我不得不計算出平均團體,我倒是用tapply這樣的:

tapply(mydata$var,mydata$group,mean) 

不幸的是,我不知道如何與不斷變化的休息= C解決這個問題的cut(...)參數爲不同的團體。

tapply(mydata$var,mydata$group,cut) 

有什麼建議嗎?我想用tapply來做,但除了定製功能之外,其他任何解決方案都是合適的。

編輯:一些小例子:

test <- data.frame(var=rnorm(100,0,1), 
       group=c(rep("A",30), 
         rep("B",20), 
         rep("C",50))) 
# for group A: 
cut(test$var,breaks=c(-4,0,4)) 
# for group B 
cut(test$var,breaks=c(-4,1,4)) 

等等...

+0

你能構建一個小例子嗎?現在還不清楚你希望'group'決定/指導cut()'斷點的選擇。 – 2011-12-23 15:22:40

+0

感謝您的評論,HTH。 – 2011-12-23 15:29:16

回答

2

我要去把我的心讀帽子放在這裏,並採取你想要的東西像這樣的刺:

dat <- data.frame(x = runif(100),grp = rep(letters[1:3],length.out = 100)) 

mapply(cut,split(dat$x,dat$grp),list(c(-Inf,0.5,Inf), 
            c(-Inf,0.1,0.5,0.9,Inf), 
            c(-Inf,0.25,0.5,0.75,Inf))) 

因此,這是通過簡單地grp分裂x和使用,每件不同的休息申請cut每件。

+0

此解決方案存在問題:我需要取消結果,因爲我想再次將接收的因子添加到原始data.frame。通過unlisting我只是混合整理。 – 2011-12-23 15:37:52

+2

@ ran2然後我真的很困惑;使用不同的休息切割每件作品會產生不同程度的因素。如果你打算把它們重新組合成一個因素,你只能有一套關卡。 – joran 2011-12-23 15:41:10

+0

我明白了。老實說,我沒有考慮到這一點。可能我不能使用因素。我使用這些中斷作爲大小類,這些類取決於數據所屬的組。我的data.frame包含幾個變量,這些變量彙總在一些結合了變量的特定程序中。我需要爲每個大小類別分別執行聚合。所以,如果只有組和x變量被分裂分裂,它沒有什麼幫助。也許我的整個方法不太好。任何更好的想法? – 2011-12-23 15:50:32

1

其實R在這裏表現得相當聰明。我找到了一種解決方案,它的工作方式與我最初想的一樣。雖然它不使用apply系列。不知何故R在這裏創建整數而不是因素 - 這就是爲什麼在這個解決方案中,像Joran提到的因子水平沒有問題。

dat <- data.frame(x = rnorm(100),grp = rep(letters[1:3],length.out = 100)) 
ifelse(dat$grp == "a",cut(dat$x,breaks=c(-Inf,0.1,0.2,Inf)), 
     ifelse(dat$grp == "b",cut(dat$x,breaks=c(-Inf,0.1,1,Inf)), 
       cut(dat$x,breaks=c(-Inf,0.9,2,Inf)))) 
+0

好的,我明白了。你可能可以通過'asgeinte'強制每個片斷然後'unlist'來在'mapply'的輸出結果上得到相同的結果。很高興你知道了,但。 – joran 2011-12-23 16:34:22

+0

沒有你的評論,我可能會永遠嘗試和一天。根本沒有想到限於一套因素水平 - 如果你知道的話,這是非常明顯的。謝謝! – 2011-12-23 16:42:06