在R中动态计算列的百分比

时间:2017-01-10 13:24:35

标签: r dataframe division

这是我的数据

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

这就是我想要实现的目标

 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      .      .       .

这就是我试过的

 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

我想为循环中的所有列自动执行此操作,因此我首先测试了一列 但我没有得到适当的输出 任何帮助将不胜感激。谢谢!!!

2 个答案:

答案 0 :(得分:3)

我们可以使用

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

答案 1 :(得分: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 = '')