【问题标题】:How to create a Markdown table with different column lengths based on a dataframe in long format in R?如何基于 R 中长格式的数据框创建具有不同列长度的 Markdown 表?
【发布时间】:2019-02-26 13:54:49
【问题描述】:

我正在处理一个 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>

【问题讨论】:

    标签: r dplyr markdown r-markdown reshape


    【解决方案1】:

    我们可以从old answer of mine 借用一种方法来解决不同的问题,并修改经典的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     
    

    【讨论】:

    • 如果你使用 data_frame,它不会默认将字符串转换为因子,你也不会收到警告
    • @duckmayr 这正是我想要的。非常感谢。我尝试了一天多,对这个解决方案非常满意。
    猜你喜欢
    • 1970-01-01
    • 2023-02-18
    • 1970-01-01
    • 1970-01-01
    • 2021-09-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-04
    相关资源
    最近更新 更多