2011-11-24 6 views
1

의 나는 내가 이러한 조건data.frame의 컬럼에 함수를 적용하는 방법?

평균 베타 AA에 0-0.2 변화, 를 사용하여 각 행의 문자에 모든 숫자 값을 변경하려면이

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 

같은 수치와 데이터 프레임 있다고 가정 해 봅시다 평균 베타 AB에 0.4-0.6 변화, 평균 베타 BB

에 0.8-1 변화는 그래서 그

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 

첫 번째 열을 얻을? 당신은 cut를 사용할 수있는 사전

+0

당신은'lapply' 또는'sapply' 대신'apply'를 사용할 필요가 – Andrie

+0

OK, 고마워요. – 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' 최근까지 우리 모두가 해낸 방법입니다. 'text = ...'to'read.table'은 R2.14.0의 새로운 기능입니다. – Andrie

+0

주제에서 벗어나지 만, read.table (text = "")로 데이터를 읽는 것을 좋아합니다. 나는 다음을 사용했다 :'ascii <- function (x, header = TRUE, ...) { 이름 <-textConnection (x) DF

+0

안녕하세요! 이것은 좋은 일이지만 데이터 프레임을 반환하는 방법이 있습니까? 즉, 새로운 테이블은 클래스'matrix'를 허용합니다. 'as.data.frame'을 사용하지 않고'data.frame'을 만들고 싶습니다. –

3

에서

감사 : 나는 파티션 모두 당신의 간격에 대한 NA를 사용하기 때문에

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 

주의 경고.

+0

+1은'cut'을 사용합니다 +1 – Andrie

+0

+1하고 싶습니다. 내 자신의 기능으로 변경했지만 모든 컬럼에 적용한 것과 같은 변경이 필요합니다. – user976991

+0

@Andrie가 말했듯이,'sapply'를 사용합니다. – James

관련 문제