1

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

我有一个看起来像这样的数据框:

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地图弹出窗口),它通过以下方式减少数据:

位置 A

组织 1

项目一;项目b

组织 2

项目c

位置 B

组织 2

项目d

组织 3

项目e;项目 f

ETC

我一直在玩制作列表和 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]>

以及更典型的基于列表的方法:

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

但显然这些只是完成了一半的工作(我还没有引入project变量)并且需要转换为下一阶段的字符串。

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

4

1 回答 1

3

您可以使用以下方法执行以下操作Rmarkdown

想法是将您的布局转换为每组的降价。这与 SO 上的样式相同。您可以在此处找到完整的备忘单。

要获得所需的样式,您需要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
```

这会给你:

在此处输入图像描述

于 2017-02-16T07:15:37.570 回答