造一句话概括一个简单的数据框

Sta*_*taq 5 r dataframe

我有一个简单的 df 如下,我想为其创建一个摘要符号。最有效的构建方法是什么?有人可以指导我吗?

在此输入图像描述

我想要构建的摘要是: There are 2 students in ELA: G8-01, G9-08; There are 2 students in MATH: G8-09, G9-06; There is 1 student in ART: G9-04.

structure(list(ID = c("G8-01", "G8-09", "G9-08", "G9-04", "G9-05", 
"G9-06", "G9-07"), ELA = c("G8-01", NA, "G9-08", NA, NA, NA, 
NA), MATH = c(NA, "G8-09", NA, NA, NA, "G9-06", NA), PE = c(NA, 
NA, NA, NA, NA, NA, NA), ART = c(NA, NA, NA, "G9-04", NA, NA, 
NA)), row.names = c(NA, -7L), class = c("tbl_df", "tbl", "data.frame"))
Run Code Online (Sandbox Code Playgroud)

Dar*_*sai 8

tidyverse使用stringr::str_glue_data()格式化字符串的解决方案:

library(tidyverse)

df %>%
  pivot_longer(-1, values_drop_na = TRUE) %>%
  group_by(name) %>%
  summarise(n = n(), id = toString(value)) %>%
  str_glue_data("There {ifelse(n>1, 'are', 'is')} {n} student{ifelse(n>1, 's', '')} in {name}: {id};")
Run Code Online (Sandbox Code Playgroud)

返回

# There is 1 student in ART: G9-04;
# There are 2 students in ELA: G8-01, G9-08;
# There are 2 students in MATH: G8-09, G9-06;
Run Code Online (Sandbox Code Playgroud)

  • 作品。以防万一有人感兴趣,您可以用此替换最后一行作为替代方案(我只是发现当事情变得更加复杂时pluralize()非常强大):`pmap_chr(〜pluralize(“There {qty(..2)} {?是/是} {..2} 学生{?s},位于 {..1}: {..3}"))` (2认同)

All*_*ron 6

您通常会使用 来执行此操作cat。您可能想将列及其名称映射在一起,为了整洁起见,将其放在一个小函数中:

report <- function(data) {
  Map(function(x, nm) {
    cat('There are ', sum(!is.na(x)), " students in ", nm, ": ",
        paste(x[!is.na(x)], collapse = ', '), '\n', sep = '')
  }, x = data[-1], nm = names(data)[-1])
  invisible(NULL)
}
Run Code Online (Sandbox Code Playgroud)

这导致:

report(df)
#> There are 2 students in ELA: G8-01, G9-08
#> There are 2 students in MATH: G8-09, G9-06
#> There are 0 students in PE:
#> There are 1 students in ART: G9-04
Run Code Online (Sandbox Code Playgroud)


小智 6

您可以pluralize()从包装中使用cli

library(cli)
library(dplyr)
library(purrr)

df %>% 
  select(-ID) %>% 
  map(discard, is.na) %>% 
  compact() %>% 
  iwalk(~ cat(pluralize("There {qty(length(.x))}{?is/are} {length(.x)} student{?s} in {qty(.y)}{.y}: {qty(.x)}{.x}"), sep = "\n"))
Run Code Online (Sandbox Code Playgroud)

给出以下结果:

There are 2 students in ELA: G8-01 and G9-08
There are 2 students in MATH: G8-09 and G9-06
There is 1 student in ART: G9-04
Run Code Online (Sandbox Code Playgroud)

如果您想在其他地方使用它,您可以调整它以返回文本。我cat()在这个例子中只是将其打印到控制台。

例如保存文本:

There are 2 students in ELA: G8-01 and G9-08
There are 2 students in MATH: G8-09 and G9-06
There is 1 student in ART: G9-04
Run Code Online (Sandbox Code Playgroud)