获取数据框的按行百分比

时间:2019-02-28 23:02:58

标签: r dataframe

给出这样的数据框:

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,因此我在寻找一种简单的解决方案,不需要单独计算每个值。

2 个答案:

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