给出这样的数据框:
id v1 v2 v3 v4
1 10 20 60 10
2 10 10 10 70
3 50 25 10 15
我想这样获得他们的按行百分比:
id v1 v2 v3 v4 p1 p2 p3 p4
1 10 20 60 10 0.1 0.2 0.6 0.1
2 10 10 10 70 0.1 0.1 0.1 0.7
3 50 25 10 15 0.5 0.25 0.10 0.15
因此,我需要保留原始变量并创建新变量以反映它们的相对百分比,实际上变量一路达到55,因此我在寻找一种简单的解决方案,不需要单独计算每个值。
答案 0 :(得分:2)
setNames(object = df1[,-1]/rowSums(df1[,-1]),
nm = gsub("[(v)\\d+]", "p", colnames(df1[,-1])))
# p1 p2 p3 p4
#1 0.1 0.20 0.6 0.10
#2 0.1 0.10 0.1 0.70
#3 0.5 0.25 0.1 0.15
答案 1 :(得分:0)
这是一个tidyverse
选项
library(tidyverse)
left_join(df, df %>%
gather(k, v, -id) %>%
group_by(id) %>%
mutate(frac = v / sum(v), v = NULL, k = str_replace(k, "v", "p")) %>%
spread(k, frac))
# id v1 v2 v3 v4 p1 p2 p3 p4
#1 1 10 20 60 10 0.1 0.20 0.6 0.10
#2 2 10 10 10 70 0.1 0.10 0.1 0.70
#3 3 50 25 10 15 0.5 0.25 0.1 0.15
df <- read.table(text =
"id v1 v2 v3 v4
1 10 20 60 10
2 10 10 10 70
3 50 25 10 15", header = T)