2011-11-24 26 views
1

比方說,我有這樣的如何在data.frame的列間應用函數?

AA01.AVG_Beta AA02.AVG_Beta AA03.AVG_Beta AA04.AVG_Beta AA05.AVG_Beta 
1  0.15851770 0.44264830 0.46662180 0.79579230 0.555430100 
2  0.87148450 0.93462340 0.92591830 0.93812860 0.942683400 
3  0.60907060 0.92463760 0.62698660 0.86852790 0.457659300 
4  0.10728340 0.07848221 0.06340047 0.08589865 0.118239800 
5  0.72353630 0.91198210 0.87339600 0.88050440 0.902925300 
6  0.52616050 0.57114700 0.29431990 0.56032260 0.530103800 
7  0.50321330 0.78129660 0.26986880 0.77825860 0.924097500 
8  0.47808630 0.11267250 0.30519660 0.36128510 0.741012600 
9  0.17698960 0.11461960 0.57776080 0.37801670 0.465766500 
10 0.01268375 0.01370702 0.01194124 0.01227029 0.009222724 

我想用這些條件

平均公測0-0.2變化AA, 改變所有數值以信件每行與數值的數據幀平均公測0.4-0.6變化AB, 平均公測0.8-1變化BB

所以我寫了類似的東西

apply(table, 2, function(x) ifelse (x>0 & x< 0.2, "AA",ifelse(x>0.4 & x<0.6,"AB", 
+ "BB")) ) 

但我得到這個

AA01.AVG_Beta AA02.AVG_Beta AA03.AVG_Beta AA04.AVG_Beta AA05.AVG_Beta 
[1,] "AA"   NA   NA   NA   NA   
[2,] "BB"   NA   NA   NA   NA   
[3,] "BB"   NA   NA   NA   NA   
[4,] "AA"   NA   NA   NA   NA   
[5,] "BB"   NA   NA   NA   NA   
[6,] "AB"   NA   NA   NA   NA   
[7,] "AB"   NA   NA   NA   NA   
[8,] "AB"   NA   NA   NA   NA   
[9,] "AA"   NA   NA   NA   NA   
[10,] "AA"   NA   NA   NA   NA 

只有第一列 也許我缺少與相關的for循環的東西嗎?

在此先感謝

+0

您需要使用'lapply'或'sapply'取代'apply' – Andrie

+0

好的,非常感謝 – user976991

+0

你也應該使用'cut' - 你的嵌套ifelse函數很可能是錯誤的。 – Andrie

回答

2

使用sapply而不是apply

重建數據:

dat <- read.table(text=" 
AA01.AVG_Beta AA02.AVG_Beta AA03.AVG_Beta AA04.AVG_Beta AA05.AVG_Beta 
1  0.15851770 0.44264830 0.46662180 0.79579230 0.555430100 
2  0.87148450 0.93462340 0.92591830 0.93812860 0.942683400 
3  0.60907060 0.92463760 0.62698660 0.86852790 0.457659300 
4  0.10728340 0.07848221 0.06340047 0.08589865 0.118239800 
5  0.72353630 0.91198210 0.87339600 0.88050440 0.902925300 
6  0.52616050 0.57114700 0.29431990 0.56032260 0.530103800 
7  0.50321330 0.78129660 0.26986880 0.77825860 0.924097500 
8  0.47808630 0.11267250 0.30519660 0.36128510 0.741012600 
9  0.17698960 0.11461960 0.57776080 0.37801670 0.465766500 
10 0.01268375 0.01370702 0.01194124 0.01227029 0.009222724 
") 

使用sapply

sapply(dat, function(x) 
     ifelse (x>0 & x< 0.2, "AA",ifelse(x>0.4 & x<0.6,"AB", "BB")) 
) 

     AA01.AVG_Beta AA02.AVG_Beta AA03.AVG_Beta AA04.AVG_Beta AA05.AVG_Beta 
[1,] "AA"   "AB"   "AB"   "BB"   "AB"   
[2,] "BB"   "BB"   "BB"   "BB"   "BB"   
[3,] "BB"   "BB"   "BB"   "BB"   "AB"   
[4,] "AA"   "AA"   "AA"   "AA"   "AA"   
[5,] "BB"   "BB"   "BB"   "BB"   "BB"   
[6,] "AB"   "AB"   "BB"   "AB"   "AB"   
[7,] "AB"   "BB"   "BB"   "BB"   "BB"   
[8,] "AB"   "AA"   "BB"   "BB"   "BB"   
[9,] "AA"   "AA"   "AB"   "BB"   "AB"   
[10,] "AA"   "AA"   "AA"   "AA"   "AA"  
+1

@TylerRinker'textConnection'直到最近,我們都是這樣做的。 'read.table'的參數'text = ...'是R2.14.0 – Andrie

+0

的新功能。但是我喜歡用read.table(text =「」)讀入數據。我一直在使用:'ascii < - 函數(x,header = TRUE,...){ name <-textConnection(x) DF < - read.table(name,header,...) close (name) on.exit(closeAllConnections()) DF }' –

+0

嗨!這很好,但是有沒有辦法返回數據幀?我的意思是,新表格允許類'矩陣'。我希望有一個'data.frame'而不使用'as.data.frame' –

3

您可以使用cut

x <- c(0.15,0.2,0.4,0.6,0.8,1.0) 
cut(x,c(0,0.2,0.4,0.6,0.8,1.0),labels=c("AA",NA,"AB",NA,"BB")) 
[1] AA AA <NA> AB <NA> BB 
Levels: AA <NA> AB <NA> BB 
Warning message: 
In `levels<-`(`*tmp*`, value = c("AA", NA, "AB", NA, "BB")) : 
    duplicated levels will not be allowed in factors anymore 

注意的警告,因爲我用NA爲您的分區中的空白。

+0

+1使用'剪切' – Andrie

+0

不是我真正想要的,我需要與我自己的功能相同的更改,但適用於所有列,謝謝 – user976991

+0

正如@Andrie所說,使用'sapply' – James

相關問題