创建子集过滤数据框的摘要

时间:2021-06-11 09:15:12

标签: r

我正在尝试过滤数据,其值为 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"))


输出是两列中“可用”的频率 纽约和德国“收到”的可用/总频率

输出应该是这样的 enter image description here

3 个答案:

答案 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%"