我承认这是一个糟糕的问题标题,但我想不出合适的标题,因为我不太确定我在这里尝试做什么:
我有一个看起来像这样的数据框:
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
方法内