标题可能会有些混乱,因此我将在这里尝试更好地解释。
假设我有一个数据框:
> 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中如何实现?
答案 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()