2017-02-16 39 views
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地圖彈出窗口使用):

位置

組織1

項目;項目B

組織2

項目C

位置乙

組織2

項目d

組織3

項目è;項目˚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]> 

和更典型的基於列表的方法爲:

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方法

+1

'DF%>%GROUP_BY(地點,組織)%>%綜述(項目=名單​​(項目))%>%綜述(項目=列表(setNames(project,organization)))%>%{setNames(。$ projects,。$ location)}'? – alistaire

回答

3

中您可以執行以下操作使用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 
``` 

這會給你:

enter image description here

+0

這幾乎是我正在尋找的答案 - 我只需要刪除重複,在您的「位置A」和「位置B」的示例中,應該只出現一次。有沒有簡單的編輯來實現這一點,我會接受你的答案?非常感謝 –