这是我的数据
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
我想为循环中的所有列自动执行此操作,因此我首先测试了一列 但我没有得到适当的输出 任何帮助将不胜感激。谢谢!!!
答案 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 = '')