首页 > 解决方案 > R中的Purrr Prop.table

问题描述

我用它来获取所有列的频率表。但是,我想将相同的东西转换为频率百分比表,然后转换为数据框

mtcars %>% map(table) %>% do.call(rbind,.)

我的尝试

mtcars %>% map(prop.table(table)) 

它给出了一个错误,请帮助

sum(x) 中的错误:参数的“类型”(闭包)无效

已编辑

这是我运行您发送的代码后得到的输出,它运行完美 https://m.imgur.com/gallery/lFcKTVo

我只是怀疑我的数据集中几乎没有分类列,例如可以在图像 URL 中看到的性别。我可以构建一个函数,在其中提到我的分类变量并获得与每个类别和总数相同的东西(如果可能)

我试着做这样的事情

temp <- split(df1, df1$gender) 
temp %>% 
  imap(~ .x %>% 
         table() %>% 
         prop.table() %>% 
         as_tibble() %>% 
         set_names("value", .y)) %>% 
  reduce(full_join) %>% 
  arrange(as.numeric(value)) %>% 
  base::t() %>% 
  as_tibble(rownames = "-") %>% 
  set_names(unlist(.[1,])) %>% 
  slice(-1)

我得到以下错误表中的错误(。):尝试使用> = 2 ^ 31个元素制作表

正在处理的数据框的 Dput

structure(list(company = c("Sports Authority", "Sports Authority", 
"Sports Authority", "Sports Authority", "Sports Authority", "Sports Authority", 
"Sports Authority", "Sports Authority", "Sports Authority", "Sports Authority", 
"Sports Authority", "Sports Authority", "Sports Authority", "Sports Authority", 
"Sports Authority", "Sports Authority", "Sports Authority", "Sports Authority", 
"Sports Authority", "Sports Authority", "Sports Authority", "Sports Authority", 
"Sports Authority", "Sports Authority", "Sports Authority", "Sports Authority", 
"Sports Authority", "Sports Authority", "Sports Authority", "Sports Authority", 
"Sports Authority", "Sports Authority", "Sports Authority", "Sports Authority", 
"Sports Authority", "Sports Authority", "Sports Authority", "Sports Authority", 
"Sports Authority", "Sports Authority", "Sports Authority", "Sports Authority", 
"Sports Authority", "Sports Authority", "Sports Authority", "Sports Authority", 
"Sports Authority", "Sports Authority", "Sports Authority", "Sports Authority", 
"Sports Authority", "Sports Authority"), variety_products = c(6, 
6, 7, 7, 3, 3, 5, 8, 8, 8, 7, 9, 5, 8, 8, 1, 9, 6, 8, 5, 9, 10, 
4, 3, 7, 8, 9, 7, 7, 6, 9, 7, 8, 8, 6, 6, 4, 9, 9, 8, 9, 5, 8, 
4, 7, 8, 4, 7, 8, 4, 8, 6), quality_products = c(10, 8, 9, 10, 
6, 4, 8, 8, 10, 8, 7, 8, 6, 10, 9, 10, 10, 8, 9, 10, 10, 10, 
7, 6, 8, 8, 10, 10, 7, 3, 9, 6, 8, 8, 3, 10, 8, 10, 10, 8, 9, 
7, 9, 7, 8, 8, 6, 7, 10, 8, 9, 9), brand_products = c(10, 7, 
8, 10, 7, 5, 7, 7, 10, 8, 6, 7, 6, 8, 8, 10, 8, 7, 9, 10, 7, 
10, 7, 7, 8, 8, 10, 10, 7, 6, 9, 8, 9, 9, 6, 8, 9, 10, 7.96078431372549, 
6, 10, 6, 9, 10, 8, 7, 5, 6, 8, 7, 10, 8), overall_product_satisfaction = c(9, 
7, 9, 10, 5, 3, 8, 8, 10, 8, 7, 8, 6, 10, 9, 10, 9, 8, 9, 10, 
8, 10, 7, 6, 7, 8, 8, 10, 8, 3, 9, 8, 8, 8, 8, 8, 7, 10, 8, 7, 
9, 7, 9, 7, 7, 8, 7, 8, 8, 7, 9, 8), organized_satisfaction = c(9, 
9, 9, 10, 4, 4, 7, 7, 9, 7, 6, 8, 6, 9, 10, 10, 8, 8, 8, 7, 9, 
10, 7, 7, 9, 8, 10, 9, 8, 9, 9, 8, 7, 9, 6, 8, 7, 10, 10, 8, 
9, 7, 8, 8, 8, 9, 8, 6, 9, 8, 10, 7), cleanliness_satisfaction = c(10, 
8, 10, 10, 3, 10, 8, 8, 10, 8, 6, 9, 6, 10, 10, 10, 10, 8, 10, 
10, 9, 10, 8, 9, 8, 8, 10, 10, 7, 10, 10, 10, 10, 9, 10, 9, 10, 
10, 9, 10, 10, 6, 8, 8, 8, 7, 8, 7, 8, 10, 10, 10), staff_satisfaction = c(9, 
8, 8, 10, 1, 5, 6, 6, 10, 8, 7, 7, 4, 8, 10, 10, 9, 7, 10, 10, 
7, 10, 8, 7, 7, 8, 10, 10, 7, 9, 10, 7, 8, 9, 3, 7, 10, 10, 6, 
9, 10, 5, 8, 7, 8, 8, 6, 8, 9, 7, 10, 7), overall_experience = c(9, 
7, 9, 10, 3, 5, 7, 7, 10, 8, 7, 8, 4, 9, 9, 10, 9, 8, 9, 10, 
9, 10, 8, 8, 8, 8, 9, 10, 8, 6, 9, 9, 8, 9, 7, 7, 9, 10, 8, 7, 
9, 5, 8, 8, 7, 9, 7, 7, 8, 8, 10, 8), overall_quality = c(8, 
7, 9, 10, 5, 4, 8, 7, 10, 8, 7, 8, 4, 9, 9, 10, 10, 8, 9, 10, 
8, 10, 8, 7, 7, 8, 9, 10, 7, 4, 9, 9, 8, 8, 8, 8, 8, 10, 9, 8, 
10, 7, 9, 9, 7, 8, 7, 8, 8, 8, 9, 8), price_products = c(8, 7, 
8, 10, 2, 6, 7, 6, 9, 7, 7, 6, 6, 10, 7, 10, 6, 8, 9, 10, 7, 
10, 6, 4, 8, 7, 10, 9, 7, 6, 9, 8, 7, 7, 5, 9, 9, 8, 10, 7, 8, 
8, 8, 6, 7, 9, 7, 7, 9, 8, 10, 6), deals_savings = c(8, 8, 9, 
10, 5, 6, 9, 8, 10, 7, 6, 8, 6, 10, 9, 10, 9, 8, 10, 10, 6, 10, 
7, 6, 8, 7, 9, 10, 7, 6, 10, 8, 9, 8, 3, 9, 10, 10, 8, 8, 8, 
8, 8, 8, 8, 8, 6, 6, 8, 9, 10, 7), time_find_products = c(6, 
8, 9, 5, 2, 7.85106382978723, 9, 6, 10, 8, 6, 8, 6, 10, 7.85106382978723, 
10, 8, 7, 10, 10, 9, 10, 6, 6, 8, 8, 9, 10, 7, 6, 7.85106382978723, 
9, 8, 8, 9, 7.85106382978723, 7, 9, 9, 8, 10, 7, 8, 7, 7, 7, 
7, 7.85106382978723, 9, 7, 10, 6), overall_costs = c(8, 7, 9, 
10, 4, 5, 8, 7, 9, 7, 7, 8, 6, 10, 9, 10, 8, 8, 9, 10, 7, 10, 
7, 5, 7, 8, 9, 10, 7, 6, 9, 8, 8, 8, 8, 7, 8, 9, 8, 7, 9, 8, 
8, 7, 8, 8, 6, 7, 8, 8, 10, 7), wwpf = c(8, 7, 9, 9, 4, 4, 8, 
7, 9, 8, 6, 8, 6, 9, 8, 10, 8, 7, 9, 9, 7, 10, 8, 6, 7, 8, 8, 
10, 7, 4, 9, 9, 8, 8, 9, 8, 9, 9, 9, 7, 9, 8, 8, 8, 7, 8, 7, 
8, 9, 9, 10, 7), likelihood_return_3_months = c(8, 8, 10, 10, 
2, 2, 8, 7, 9, 8, 7, 9, 5, 10, 9, 10, 10, 9, 10, 10, 10, 10, 
8, 6, 8, 8, 8, 10, 8, 1, 9, 8, 9, 7, 8, 7, 8, 10, 8, 7, 10, 7, 
8, 8, 7, 8, 6, 6, 10, 9, 10, 9), nps = c(5, 7, 9, 10, 2, 2, 8, 
7, 9, 9, 6, 9, 4, 10, 9, 10, 10, 6, 9, 10, 9, 10, 7, 7, 8, 8, 
9, 10, 8, 0, 9, 6, 9, 8, 4, 8, 5, 10, 9, 8, 10, 6, 8, 8, 7, 8, 
6, 6, 10, 8, 10, 8), gender = c("m", "f", "m", "f", "m", "m", 
"m", "f", "f", "m", "f", "m", "f", "m", "m", "m", "f", "f", "m", 
"f", "m", "f", "m", "m", "m", "f", "f", "m", "m", "m", "f", "f", 
"m", "m", "f", "f", "f", "f", "f", "m", "m", "f", "f", "m", "m", 
"f", "m", "f", "f", "f", "m", "f"), education = c("hs", "college", 
"above_college", "hs", "hs", "above_college", "above_college", 
"above_college", "college", "college", "college", "above_college", 
"hs", "hs", "hs", "college", "above_college", "hs", "hs", "above_college", 
"above_college", "above_college", "college", "college", "college", 
"above_college", "hs", "college", "college", "above_college", 
"hs", "hs", "above_college", "above_college", "hs", "above_college", 
"above_college", "above_college", "college", "college", "college", 
"above_college", "hs", "college", "college", "above_college", 
"hs", "hs", "above_college", "above_college", "hs", "hs")), row.names = c(NA, 
-52L), class = c("tbl_df", "tbl", "data.frame"))

标签: rdata.tabletidyversepurrr

解决方案


我不太确定你想要什么,但也许这段代码会返回它。

mtcars %>%
  imap(~ {
    prop_table <- .x %>% 
      table() %>% 
      prop.table()

    temp <- cbind(matrix(c(.y, "prop", "--"), ncol = 1),
                  rbind(names(prop_table), c(prop_table), "--")) 
    colnames(temp) <- NULL
    as_tibble(temp)
  }) %>% 
  do.call("bind_rows", .)

[编辑]
好吧,这是怎么回事?

mtcars %>% 
  imap(~ .x %>% 
         table() %>% 
         prop.table() %>% 
         as_tibble() %>% 
         set_names("value", .y)) %>% 
  reduce(full_join) %>% 
  arrange(as.numeric(value)) %>% 
  t() %>% 
  as_tibble(rownames = "-") %>% 
  set_names(unlist(.[1,])) %>% 
  slice(-1)

[编辑 2]
temp不是data.frame但是list。你需要使用map(~ map(.x, ~)).

temp <- split(df1, df1$gender) 
temp %>% 
  map_dfr(~ 
            imap(.x, ~ .x %>% 
                   table() %>% 
                   prop.table() %>% 
                   as_tibble() %>% 
                   set_names("value", .y)) %>% 
            reduce(full_join) %>% 
            arrange(as.numeric(value)) %>% 
            base::t() %>% 
            as_tibble(rownames = "-") %>% 
            set_names(unlist(.[1,])) %>% 
            slice(-1)
          )

推荐阅读