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

以优雅的方式将百分比(每行)列添加到R data.frame,r,R,我想在data.frame中将百分比值作为一列。示例代码有效。但问题是,这是否是正确且优雅的R-方法 > 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

我想在
data.frame
中将百分比值作为一列。示例代码有效。但问题是,这是否是正确且优雅的R-方法

> 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
>测向
Var1频率
1    3   15
2    4   12
3    5    5
4     0
5总计32
>df$百分比df
Var1频率百分比
1    3   15  46.875
2    4   12  37.500
3    5    5  15.625
4     0   0.000
5总计32100.000

对我来说,没有必要将这个问题限制在
数据.frame

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

df <- df %>%
    mutate(percent = (Freq/nrow(mtcars)) * 100)
df%
变异(百分比=(频率/nrow(mtcars))*100)

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

df <- df %>%
    mutate(percent = (Freq/nrow(mtcars)) * 100)
df%
变异(百分比=(频率/nrow(mtcars))*100)

我认为增加利润是一种糟糕的做法,因为你把数据和摘要混为一谈

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

请注意,在汇总后无需
取消分组
,因为您只有一个分组变量,而汇总只剥离了一层分组

我认为添加边距是一种不好的做法,因为您将数据与摘要混合在一起

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

请注意,在汇总后无需
取消分组
,因为您只有一个分组变量,而汇总只剥离了一层分组

我想我会使用base R中的
函数来完成此任务(从一开始就使用它):

或者,在创建data.frame后为较短的代码位添加百分比:

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

我想我应该使用base R中的
table
函数来完成这项任务(从一开始就使用它):

或者,在创建data.frame后为较短的代码位添加百分比:

df <- data.frame(table(mtcars$gear))
df$p <- 100 * (df[,'Freq'] / sum(df[,'Freq']))
1)道具表
道具表
在这里很有用。我们使用
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
> 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"))
m1)道具表
道具表
在这里很有用。我们使用
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
> 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"))

m如果您的数据框中已经有两列用于计算百分比,为什么不直接取一个比率(可能我这里遗漏了什么)?在该示例中,总和是
mtcars
中的所有汽车(
n=32
)。其中有多少(在
%
中)有3档(或4档或5档)。
c(头部(df,-1),频率/总和(Freq)*100),100)
如果您的数据框已经有两列用于计算百分比,为什么不直接取一个比率(可能我在这里遗漏了什么)?在该示例中,总和都是汽车(
n=32
)在
mtcars
中。其中有多少(以
%
为单位)有3档(或4档或5档)。
c(带(头部(df,-1)、频率/总和(频率)*100)、100)