Как создать таблицу уценок с различными длинами столбцов на основе кадра данных в длинном формате в R? - PullRequest
0 голосов
/ 22 сентября 2018

Я работаю над файлом R Markdown, который я хотел бы представить в виде рукописи в академический журнал.Я хотел бы создать таблицу, которая показывает, какие три слова (item2) чаще всего встречаются с некоторыми ключевыми словами (item1).Обратите внимание, что некоторые ключевые слова содержат более трех слов.Данные, с которыми я сейчас работаю:

item1 <- c("water","water","water","water","water","sun","sun","sun","sun","moon","moon","moon")
item2 <- c("tree","dog","cat","fish","eagle","bird","table","bed","flower","house","desk","tiger")
n <- c("200","83","34","34","34","300","250","77","77","122","46","46")
df <- data.frame(item1,item2,n)

, что дает этот фрейм данных:

   item1  item2   n
1  water   tree 200
2  water    dog  83
3  water    cat  34
4  water   fish  34
5  water  eagle  34
6    sun   bird 300
7    sun  table 250
8    sun    bed  77
9    sun flower  77
10  moon  house 122
11  moon   desk  46
12  moon  tiger  46

В конечном счете, я хотел бы передать данные в функцию papaja::apa_table, которая требуетdata.frame (или матрица / список).Поэтому мне нужно изменить форму данных.

Мой вопрос: Как я могу изменить данные (желательно с dplyr), чтобы получить следующую структуру?

  water_item2 water_n sun_item2 sun_n moon_item2 moon_n
1        tree     200      bird   300      house    122
2         dog      83     table   250       desk     46
3         cat      34       bed    77      tiger     46
4        fish      34    flower    77       <NA>   <NA>
5       eagle      34      <NA>  <NA>       <NA>   <NA>

1 Ответ

0 голосов
/ 22 сентября 2018

Мы можем позаимствовать подход из старого моего ответа на другой вопрос и изменить классическую стратегию gather(), unite(), spread(), создав уникальные идентификаторы по группам, чтобы избежать дублированияидентификаторы, затем сбросив эту переменную:

library(dplyr)
library(tidyr)

item1 <- c("water","water","water","water","water","sun","sun","sun","sun","moon","moon","moon")
item2 <- c("tree","dog","cat","fish","eagle","bird","table","bed","flower","house","desk","tiger")
n <- c("200","83","34","34","34","300","250","77","77","122","46","46")
# Owing to Richard Telford's excellent comment,
# I use data_frame() (or equivalently for our purposes,
# data.frame(..., stringsAsFactors = FALSE))
# to avoid turning the strings into factors

df <- data_frame(item1,item2,n)

df %>% 
    group_by(item1) %>%
    mutate(id = 1:n()) %>%
    ungroup() %>%
    gather(temp, val, item2, n) %>%
    unite(temp2, item1, temp, sep = '_') %>%
    spread(temp2, val) %>%
    select(-id)

# A tibble: 5 x 6
  moon_item2 moon_n sun_item2 sun_n water_item2 water_n
  <chr>      <chr>  <chr>     <chr> <chr>       <chr>  
1 house      122    bird      300   tree        200    
2 desk       46     table     250   dog         83     
3 tiger      46     bed       77    cat         34     
4 NA         NA     flower    77    fish        34     
5 NA         NA     NA        NA    eagle       34     
...