将百分比(每行)列添加到R data.frame优雅的方式

时间:2018-05-02 13:45:53

标签: r

我希望将百分比值作为data.frame中的列。示例代码有效。但问题是否是正确的优雅的R-way 来执行此操作?

> df <- data.frame(addmargins(table(mtcars$gear, useNA="always")))
> df
  Var1 Freq
1    3   15
2    4   12
3    5    5
4 <NA>    0
5  Sum   32

> df$percent <- mapply(function(x) {100 / length(mtcars$gear) * x}, df$Freq)
> df
  Var1 Freq percent
1    3   15  46.875
2    4   12  37.500
3    5    5  15.625
4 <NA>    0   0.000
5  Sum   32 100.000

对我来说,没有必要将此问题限制为data.frame

4 个答案:

答案 0 :(得分:1)

为了清晰起见,我主张提出基于dplyr::mutate的解决方案:

df <- df %>%
    mutate(percent = (Freq/nrow(mtcars)) * 100)

答案 1 :(得分:1)

我认为在将数据与摘要混合时,添加边距是不好的做法。

df <- data.frame(table(mtcars$gear, useNA="always"))
df$pct <-df$Freq/sum(df$Freq)*100
df
#>   Var1 Freq    pct
#> 1    3   15 46.875
#> 2    4   12 37.500
#> 3    5    5 15.625
#> 4 <NA>    0  0.000

或惯用dplyr代码(无需担心table):

library(dplyr)
mtcars %>%
  group_by(gear) %>% 
  summarise(Freq=n()) %>% 
  mutate(percent=Freq/sum(Freq)*100)
#> # A tibble: 3 x 3
#>    gear  Freq percent
#>   <dbl> <int>   <dbl>
#> 1     3    15    46.9
#> 2     4    12    37.5
#> 3     5     5    15.6

请注意,总结之后不需要ungroup,因为您只有一个分组变量并且汇总正在剥离一层分组

答案 2 :(得分:1)

我想我会在基础R 中使用.config(['$routeProvider', function($routeProvider) { $routeProvider.when('/view1', { templateUrl: 'view1/view1.php', controller: 'View1Ctrl' }); }]) 函数来执行此任务(从一开始就使用它):

table

结果如下:

df <- data.frame(
  "g" = names(table(mtcars$gear)), 
  "f" = as.numeric(table(mtcars$gear)), 
  "p" = as.numeric(100 * (table(mtcars$gear)/length(mtcars$gear)))
)

或者,在创建data.frame之后添加百分比以获得更短的代码:

> df
  g  f      p
1 3 15 46.875
2 4 12 37.500
3 5  5 15.625

,并提供:

df <- data.frame(table(mtcars$gear))
df$p <- 100 * (df[,'Freq'] / sum(df[,'Freq']))

答案 3 :(得分:0)

1)prop.table prop.table在这里很有用。我们使用ave将其单独应用于数据和摘要行。

transform(df, Percent = 100 * ave(Freq, Var1 == "Sum", FUN = prop.table))

,并提供:

  Var1 Freq Percent
1    3   15  46.875
2    4   12  37.500
3    5    5  15.625
4 <NA>    0   0.000
5  Sum   32 100.000

2)表包如果这样做的目的是显示指定的表,那么表包很好。公式的LHS上的术语是指行,RHS上的术语是指列。

library(tables)

gear <- factor(mtcars$gear)
tab <- tabular(gear + 1 ~ (n=1) + Percent())

,并提供:

> tab
gear n  Percent
 3    15  46.88 
 4    12  37.50 
 5     5  15.62 
 All  32 100.00 

现在可以使用html(tab)latex(tab)生成HTML和LaTeX输出。

这种方法更适合于显示,但如果您真的想要提取数据,可以这样做:

m <- as.matrix(tab, format = as.numeric)
dimnames(m) <- list(attr(tab, "rowLabels"), attr(tab, "colLabels"))