在以后的问题中,请表明您至少为自己解决问题付出了最少的努力。
这里有两种使用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