我希望将百分比值作为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
。
答案 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"))