2017-01-10 4 views
1

이이 내가이 내가 시도 무엇산출 비율은

No col1 col2 col3 Total p_col1 p_col2 p_col3 
    1 5 8 9  70 (5/70) (8/70) (9/70) 
    2 3 4 11 80 (3/80) (4/80) (11/80) 
    . . . .  .  .  .  . 
    . . . .  .  .  .  . 
    10 6 1 15 90  .  .  . 

을 달성하기 위해 노력하고있어입니다

No col1 col2 col3 Total 
1 5 8 9  70 
2 3 4 11 80 
. . . .  . 
. . . .  . 
10 6 1 15 90 

내 데이터입니다

DF1=read.csv("R/path/abc_5.csv") 
DF1 <- DF1[,c(1:6,12)] 
nop <- basename("R/path/abc_5.csv") 
    m <- gregexpr("[0-9]", nop) 
    nop <- as.numeric(unlist(regmatches(nop, m))) 
    nop <- nop[length(nop)] 
    DF2 <- DF1[,2:(nop+1)] 
    cn <- colnames(DF1)[2:(nop+1)] 
    cn_p <- paste("p_",cn) 
    DF1$cn_p[1] <- mapply("/", DF1$cn[1], DF1$Total)*100 

루프 안의 모든 열에 대해이 작업을 자동화하고 싶습니다. 따라서 먼저 한 열만 테스트했습니다. 하지만 점점 커지지는 않습니다. 적절한 출력 도움이 많이 감사 할 것입니다. 감사합니다 !!!

+0

을 사용할 수 있습니다 ]])'; 그리고 나서'cbind()' –

답변

3

우리는 당신이 단지에`sapply (DT [C (-1, -ncol (DT)), 기능 (I) I/DT [[ "총"필요

DF1[paste0("p_", names(DF1)[2:4])] <- DF1[2:4]/DF1$Total 
+0

내 솔루션보다 훨씬 낫습니다! –

+0

@ChirayuChamoli 코멘트 주셔서 감사합니다. – akrun

+1

@akrun 당신이 매우 간단하게 만들었습니다. 불필요하게 루프를 사용하여 복잡하게 만들려고했다고 생각합니다. 엄청 고마워!!! – Deepesh

2

이 방법이 유용 할 것입니다. sapply을 사용하여 총계로 나눠진 행을 피드합니다. names을 사용하여 새로 작성한 컬럼에 이름을 지정할 수 있습니다.

xx=cbind(df,sapply(df[2:(ncol(df)-1)], function(x) x/df$Total)) 
names(xx)[(ncol(df)+1):(length(xx))]=paste('p_',names(xx)[(ncol(df)+1):(length(xx))], sep = '') 
+0

왜 내부에'apply()'가 있습니까? –

+0

예, 이해했습니다 ... 변경하십시오. –