2014-05-22 3 views
2
aaa<-data.frame(group=c("A","B"),x1=c(2,8),x2=c(8,2),total=c(10,10),stringsAsFactors=FALSE) 

이제 freqency 행 아래의 새 행으로 행 백분율을 계산하려고합니다. 새로운 데이터 프레임은 다음과 같습니다 :행을 데이터 프레임에 새 행으로 추가하는 방법

group x1  x2  total 
A  2  8  10 
%  20.00 80.00 
B  8  2 
%  80.00 20.00 10 

어떻게할까요? 고맙습니다!

답변

3

향후 질문이 있으시면, 최소한의 노력으로 직접 문제를 해결해주십시오.

여기에 lapply을 사용하는 두 가지 방법이 있습니다. 두 번째는 편집에서 나중에 추가되었으므로 첫 번째보다 훨씬 간단합니다.

> newD <- do.call(rbind, lapply(seq(nrow(aaa)), function(i){ 
     x1 <- 100*(aaa$x1[i]/aaa$total[i]) 
     x2 <- 100*(aaa$x2[i]/aaa$total[i]) 
     rbind(aaa[i, ], c('%', x1, x2, '')) 
    })) 
> rownames(newD) <- seq(nrow(newD)) 
> newD 
# group x1 x2 total 
# 1  A 2 8 10 
# 2  % 20 80  
# 3  B 8 2 10 
# 4  % 80 20 

두 번째, 훨씬 더 lapply 방법 :

> pct <- cbind(group = '%', 100*aaa[2:3]/aaa$total, total = '') 
> do.call(rbind, lapply(seq(nrow(aaa)), function(i){ rbind(aaa[i,], pct[i,]) })) 
## group x1 x2 total 
## 1  A 2 8 10 
## 2  % 20 80  
## 22  B 8 2 10 
## 21  % 80 20  

추가, 당신의 의견에 따라 :for 루프 방법

> x1 <- x2 <- numeric(nrow(aaa)) 
> rb <- vector('list', nrow(aaa)/2) 

> for(i in seq(nrow(aaa))){ 
    x1[i] <- 100*(aaa$x1[i]/aaa$total[i]) 
    x2[i] <- 100*(aaa$x2[i]/aaa$total[i]) 
    rb[[i]] <- rbind(aaa[i, ], c('%', x1[i], x2[i], '')) 
    } 

> do.call(rbind, rb) 
# group x1 x2 total 
# 1  A 2 8 10 
# 2  % 20 80  
# 22  B 8 2 10 
# 21  % 80 20  
+0

@Scriven 감사합니다. 루프를 사용하고 싶다면, 어떻게해야합니까? – stata

+1

이것은 루프입니다. 'lapply'는 루핑 함수입니다 ('i'의 사용에주의하십시오). 만약 당신이'for' 루프 메소드를 보여줄 수는 있지만,'apply' 함수는 루핑을하는 더 좋은 R 메소드입니다. –

+0

@Scriven Thanks. for 루프 메서드가 필요합니다. – stata

관련 문제