以优雅的方式将百分比(每行)列添加到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)