通过 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
```
这会给你:
我承认这是一个糟糕的问题标题,但我想不出一个合适的标题,因为我不太确定我在这里尝试做什么过程:
我有一个如下所示的数据框:
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
```
这会给你: