如何将行百分比作为新行添加到数据帧

时间:2014-05-22 20:01:39

标签: r

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中执行此操作?谢谢!

1 个答案:

答案 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