我正在尝试过滤数据,其值为 1,但数据框已标记为 。所以目标是创建过滤数据集的摘要
df <- data.frame(NY = c(1,2,1,1,2,1,1,1,2,1,1,1,2,1),
DE = c(2,1,1,1,1,2,2,1,1,1,2,2,2,1) )
df$NY<- factor(df$NY, levels =c(1,2), labels = c("unavailable","available"))
df$DE<- factor(df$DE, levels =c(1,2), labels = c("rejected","recieved"))
输出是两列中“可用”的频率 纽约和德国“收到”的可用/总频率
答案 0 :(得分:1)
这种格式的输出是否有用?
library(janitor)
library(tidyverse)
df %>% pivot_longer(everything()) %>%
tabyl(name, value) %>%
adorn_percentages() %>%
adorn_pct_formatting(digits = 2)
#> name available unavailable
#> DE 50.00% 50.00%
#> NY 71.43% 28.57%
在修改场景的情况下
df %>% pivot_longer(everything()) %>%
tabyl(value, name) %>%
adorn_percentages('col') %>%
filter(value %in% c('available', 'recieved')) %>%
adorn_totals('row') %>%
adorn_pct_formatting(digits = 2) %>%
tail(1)
value DE NY
Total 50.00% 71.43%
答案 1 :(得分:0)
这里有一个 tidyverse 方法来解决您的问题,它以十进制形式输出百分比:
library(tidyverse)
df %>% summarise(across(everything(), ~ sum(. == "available")/n()))
输出:
NY DE
1 0.7142857 0.5
答案 2 :(得分:0)
您可以通过每列尝试 map_df()
。
df %>%
map_df(
~ (mean(. == "available") * 100) %>%
round() %>%
paste("%")
)
# # A tibble: 1 x 2
# NY DE
# <chr> <chr>
# 1 71 % 50 %
对于不同的期望值,一种方法是创建如下命名的向量并将其传递给自定义函数。请注意,输出是一个字符向量,但您可以根据需要进行更改。
values <- c(NY = "available",
DE = "received")
get_percent <- function(.data, .values) {
vars <- names(.values)
pct <- sapply(
seq_along(.values),
function(.) round(mean(.data[[ vars[.] ]] == .values[vars[.]]) * 100)
)
pct <- paste0(pct, "%")
names(pct) <- vars
pct
}
res <- get_percent(df, values)
res
# NY DE
# "29%" "43%"