aaa<-data.frame(group=c("A","B"),x1=c(2,8),x2=c(8,2),total=c(10,10),stringsAsFactors=FALSE)
现在我想将行百分比计算为频率行下面的新行。新数据框如:
group x1 x2 total
A 2 8 10
% 20.00 80.00
B 8 2
% 80.00 20.00 10
如何在R中执行此操作?谢谢!
答案 0 :(得分: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