Как создать текст из фрейма данных по двум категориальным столбцам - PullRequest
0 голосов
/ 02 февраля 2019

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

Это для отправки в rmarkdown документ для создания Word или HTML документа.Я пытался преобразовать в список и использовать by () с вставкой для объединения столбцов, но не могу получить то, что я хочу.

df=data.frame(cat1=c("A","A","A","B","B","C","C","C"),

  cat2=c("D","D","E","D","F","D","G","G"),

  text1=c("text1","text2","text3","text4","text5","text6","text7","text8"),

  text2=c("text9","text10","text11","text12","text13","text14","text15","text16"))

Я хочу что-то вроде:

A: D:

text1, text9

text2, text10

A: E:

text3, text11

B: D:

text4, text12

B: F:

text5, text13

C: D:

text6, text14

C: G:

text7, text15

text8, text 16

Я получаю сложные списки, которые не могу разобрать.

Ответы [ 3 ]

0 голосов
/ 02 февраля 2019

Вы можете получить это с aggregate и paste

T1 = aggregate(df$text1, list(df$cat1, df$cat2), paste, collapse = ", ")
T2 = aggregate(df$text2, list(df$cat1, df$cat2), paste, collapse = ", ")
T1$x = paste(T1$x, T2$x, sep=", ")
T1
  Group.1 Group.2                            x
1       A       D  text1, text2, text9, text10
2       B       D                text4, text12
3       C       D                text6, text14
4       A       E                text3, text11
5       B       F                text5, text13
6       C       G text7, text8, text15, text16
0 голосов
/ 03 февраля 2019

Вот мое текущее решение:

for (i in unique(df$cat1)) {
  cat(i,"\n")
  for (j in unique(df[df$cat1==i,"cat2"])) {
    cat(paste(" ",j),"\n")
    for (k in df$line[df$cat1==i & df$cat2==j])
    cat(paste("   ",k),"\n")
  }
}

Что дает:

A 
  D 
    text1, text9 
    text2, text10 
  E 
    text3, text11 
B 
  D 
    text4, text12 
  F 
    text5, text13 
C 
  D 
    text6, text14 
  G 
    text7, text15 
    text8, text16 
0 голосов
/ 02 февраля 2019

Используйте summarise для подготовки данных, а затем цикл с cat для печати в rmarkdown.Используя results = "asis" в параметрах чанка, вы можете включить форматирование в команду cat.

```{r, results = "asis"}

library(dplyr)

newdf <- df %>% 
  group_by(cat1, cat2) %>%
  summarise(mystring = paste(text1, text2, sep = ", ", collapse = "  \n"))

for (i in 1:nrow(newdf)) {
  with(newdf, cat("  \n####**", cat1[i], ": ", cat2[i], ":**", "  \n\n", mystring[i], "  \n", sep = "" )) }

```

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...