将特定列的行求和,然后找到行的比率,列条目与行的总和

时间:2019-12-03 07:15:31

标签: r dataframe

标题可能会有些混乱,因此我将在这里尝试更好地解释。

假设我有一个数据框:

> df = data.frame(a=c(8,6,4,2),b=c(9,7,4,3),c=c(10,6,3,3),d=c(8,6,3,2))
> df
  a b  c d
1 8 9 10 8
2 6 7  6 6
3 4 4  3 3
4 2 3  3 2

我想要的输出是:

> dfDesired = data.frame(a=c(8,6,4,2),b=c(0.33,0.37,0.4,0.38),c=c(0.37,0.32,0.3,0.38)
+                        ,d=c(0.3,0.32,0.3,0.25))
> dfDesired
  a    b    c    d
1 8 0.33 0.37 0.30
2 6 0.37 0.32 0.32
3 4 0.40 0.30 0.30
4 2 0.38 0.38 0.25

首先,我只希望对特定列(在本例中为b,c,d列)进行计算。 其次,我想对指定列的行中的值求和。因此,对于第1行,9 + 10 + 8 = 27。然后,我想找到每个单元格相对于行总和的比率。因此,对于第1行,对于其他行,再次为9/27 = 0.33、10 / 27 = 0.37、8 / 27 = 0.3,等等。

这在R中如何实现?

3 个答案:

答案 0 :(得分:2)

我们可以使用prop.table(边距= 1)来计算行比例。

cbind(df[1], prop.table(as.matrix(df[-1]), 1))

#  a     b     c     d
#1 8 0.333 0.370 0.296
#2 6 0.368 0.316 0.316
#3 4 0.400 0.300 0.300
#4 2 0.375 0.375 0.250

使列的选择更加明确

cols <- c("b", "c", "d")
cbind(df[setdiff(names(df), cols)], prop.table(as.matrix(df[cols]), 1))

答案 1 :(得分:0)

我们可以获取列'b','c','d'的rowSums,然后使用它来划分列

dfnew <- df
dfnew[-1] <- round(df[-1]/rowSums(df[-1]), 2)
dfnew
#  a    b    c    d
#1 8 0.33 0.37 0.30
#2 6 0.37 0.32 0.32
#3 4 0.40 0.30 0.30
#4 2 0.38 0.38 0.25

rowSums也被概括了


或使用tidyverse

library(purrr)
library(dplyr) 
library(magrittr)
df %>% 
  select(-a) %>%
  reduce(`+`) %>% 
  divide_by(df[-1]) %>%
   bind_cols(df['a'], .)

答案 2 :(得分:0)

更通用的方法是使用<html> <head> <meta charset="utf-8"> <title></title> <body> <img id="robot" src="https://via.placeholder.com/100x100.png"> </body> </html>

apply()