通过 r 中的列表列表将数据框转换为描述性文本

Convert dataframe to descriptive text via list of lists in r

我承认这是一个糟糕的问题标题,但我想不出一个合适的标题,因为我不太确定我在这里尝试做什么过程:

我有一个如下所示的数据框:

df <- 
  data.frame(
    location = rep(LETTERS[1:4], each = 3),
    organisation = rep(1:6, each = 2),
    project = rep(letters[1:12])
  )

   location organisation project
1         A            1       a
2         A            1       b
3         A            2       c
4         B            2       d
5         B            3       e
6         B            3       f
7         C            4       g
8         C            4       h
9         C            5       i
10        D            5       j
11        D            6       k
12        D            6       l

我想将其转换成一些文本(用于 leaflet 地图弹出窗口),以下列方式减少数据:

location A

organisation 1

project a; project b

organisation 2

project c

location B

organisation 2

project d

organisation 3

project e; project f

等等

我一直在尝试制作列表和 for 循环,但一直在努力寻找正确的语法。我 认为 我应该做的是创建一个列表列表,例如:

list(
  A = 
    list(
      '1' = list('a', 'b'), 
      '2' = list('c')
    ),
  B = 
    list(
      '2' = list('d'), 
      '3' = list('e', 'f'))
)

等,给予:

$A
$A$`1`
$A$`1`[[1]]
[1] "a"

$A$`1`[[2]]
[1] "b"


$A$`2`
$A$`2`[[1]]
[1] "c"


$B
$B$`2`
$B$`2`[[1]]
[1] "d"


$B$`3`
$B$`3`[[1]]
[1] "e"

$B$`3`[[2]]
[1] "f"

等,但我想以编程方式执行此操作,然后在创建文本时访问这些元素。我正在尝试在 'tidyverse' 方法中执行此操作,并使用

创建了两个嵌套数据框
library(tidyverse)

df %>% 
  group_by(location, organisation) %>% 
  nest

给予:

# A tibble: 8 × 3
  location organisation             data
    <fctr>        <int>           <list>
1        A            1 <tibble [2 × 1]>
2        A            2 <tibble [1 × 1]>
3        B            2 <tibble [1 × 1]>
4        B            3 <tibble [2 × 1]>
5        C            4 <tibble [2 × 1]>
6        C            5 <tibble [1 × 1]>
7        D            5 <tibble [1 × 1]>
8        D            6 <tibble [2 × 1]>

和更典型的 list-based 方法如:

library(tidyverse)

loc_names <- unique(df$location)

map(
  loc_names,
  ~ unique(df$organisation[df$location %in% .])
) %>% 
  set_names(loc_names)

给予:

$A
[1] 1 2

$B
[1] 2 3

$C
[1] 4 5

$D
[1] 5 6

但显然这些只是 half-finished 的努力(我还没有引入 project 变量)并且需要在下一阶段转换为字符串。

非常感谢所有帮助,特别是如果保持在 tidyverse 方法内

您可以使用 Rmarkdown 执行以下操作:

我们的想法是将您的布局转换为每组降价。 这与 SO 上的样式相同。您可以找到完整的 cheatsheet here.

要获得您想要的样式,您需要为块设置 results='asis' 标志。这样,结果将呈现为降价。

---
title: "Untitled"
output: html_document
---

```{r setup, include=FALSE}
knitr::opts_chunk$set(echo = TRUE)
library(tidyverse)
```

## R Markdown


```{r pressure, echo=FALSE, results='asis'}
df <- 
  data.frame(
    location = rep(LETTERS[1:4], each = 3),
    organisation = rep(1:6, each = 2),
    project = rep(letters[1:12])
  )

cat_group <- function(dat){
  cat(sprintf("\n### location %s\n", as.character(dat$location[1])))
  by_row(dat, ~cat(sprintf("
__organisation %s__\n
%s\n", .$organisation, .$projects)))
}

df %>% 
  group_by(location, organisation) %>% 
  summarise(projects = paste("project", project, collapse = "; ")) %>% 
  group_by(location) %>% 
  do(cat_group(.)) %>% 
  invisible
```

这会给你: