R - как программно фильтровать данные из фрейма данных - PullRequest
0 голосов
/ 03 марта 2020

У меня есть датафрейм, что-то вроде этого

test <-
  data.frame(
    product = c("car", "phone", "car", "computer"),
    country = c("us",  "us", "uk", "world"),
    price = c(12,  44, 87, 78)
  )

Я называю документ уценки вот так

rmarkdown::render(
  input = "sale_template.Rmd",
  params = list(
    test= test
  ),
  output_file = format(month, "%Y-%m-%d")
)

. Чего я хотел бы добиться:

  • фильтровать данные по продукту
  • создать сводку для каждого типа продукта (создать новую строку с текстом продукта "итого", столбцами суммы в цене и другие столбцы)
  • укажите значение продукта в качестве заголовка блока

    телефон

    
    datatable(
      params$test,
      rownames = F,
      options = list(
        pageLength = 99,
        dom = "t",
        columnDefs = list(list(className = "dt-center", targets = "_all")),
        ordering = F
      )) 
    

    телефон

    
    datatable(
      params$test,
      rownames = F,
      options = list(
        pageLength = 99,
        dom = "t",
        columnDefs = list(list(className = "dt-center", targets = "_all")),
        ordering = F
      )) 
    

Пожалуйста, имейте в виду, что в моем столбце продуктов есть десятки различных значений, которые нельзя отфильтровать вручную.

Для аналогичных, но с графиками ggplot, я использую это.

plotlist <- split(sales, sales$month)
plotlist <- lapply(plotlist, function(df){
  ggplot(df, aes(x = month, y = type, fill = type)) +
    geom_col(position = "dodge")
})

## Month 1

```{r}
print(plotlist[[1]])
```

## Month 2

```{r}
print(plotlist[[2]])
```

Но я не знаю, как вызывать мои кадры данных с неизвестной длиной / длиной списка в mardkown и использовать функцию данных.

1 Ответ

0 голосов
/ 03 марта 2020

Если вы используете Rmd и knitr, вы можете создать шаблон для того, что вы хотите для каждого проекта, а затем вызвать его из основного файла, используя knit_expand и unlist, например:

SubTemplate.Rmd

```{r}
thisdf <- df %>% filter(project == {{project}})
thisproject <- as.character({{project}})
```

### `r thisproject`

blah blah blah

```{r maketable}
# do stuff in here with thisdf to output your table
```

MainFile.Rmd

```{r}
#all of your other code for the Rmd
```
```{r eachone}
    ## Generate report for each 
    products <- sort(unique(df$product))
    src <- lapply(products, function(product) knitr::knit_expand(file = "SubTemplate.Rmd"))
```
`r knitr::knit(text = unlist(src))`
...