【问题标题】:How to create Matrix from a Dataframe?如何从数据框创建矩阵?
【发布时间】:2021-04-18 07:16:01
【问题描述】:

我有下表,并希望在 R 中为每个唯一 ID 创建一个新列

MeetingID <- c("01", "02","03","02","04","03") 
Attendee <- c("Alex","Bob","Tim","Xavier","Ana","Bob")
AttendedMonth <- c("Jan","Apr","Feb","Apri","Feb","Feb")

df <- data.frame(MeetingID, Attendee,AttendedMonth)
MeetingID Attendeee AttendedMonth
01 Alex Jan
02 Bob Apr
03 Tim Feb
02 Xavier Apr
04 Ana Feb
03 Bob Feb

我打算创建一个类似于矩阵的数据框,其中对于每个 MeetingID,如果与会者没有参加会议,我想标记 (0),如果与会者参加了会议,我想标记 (1)

Attendee 01 02 03 04
Alex 1 0 0 0
Bob 0 1 1 0
Tim 0 0 1 0
Xavier 0 1 0 0
Ana 0 0 0 1

【问题讨论】:

    标签: r dataframe dplyr tidyr


    【解决方案1】:

    你可以使用tidyr::pivot_wider:

    library(tidyr)
    library(dplyr)
    
    df %>% mutate(attended = 1) %>% 
      select(-AttendedMonth) %>%
      pivot_wider(names_from=MeetingID,values_from = attended,) %>%
      mutate(across(everything(),replace_na, replace = 0))
    
    # A tibble: 5 x 5
      Attendee  `01`  `02`  `03`  `04`
      <chr>    <dbl> <dbl> <dbl> <dbl>
    1 Alex         1     0     0     0
    2 Bob          0     1     1     0
    3 Tim          0     0     1     0
    4 Xavier       0     1     0     0
    5 Ana          0     0     0     1
    

    【讨论】:

    • 我有一个问题,如果我们不查看 AttendedMonth,如何将 Bob 所在的索引 2 和 6 结合起来。
    • 查看我的编辑:必须选择未使用的 AttendedMonth。
    【解决方案2】:

    对于这些情况,我总是推荐janitor

    df %>% janitor::tabyl(Attendee, MeetingID)
    
     Attendee 01 02 03 04
         Alex  1  0  0  0
          Ana  0  0  0  1
          Bob  0  1  1  0
          Tim  0  0  1  0
       Xavier  0  1  0  0
    

    你也可以有不错的行/列总计

    df %>% tabyl(Attendee, MeetingID) %>%
      adorn_totals(c("row", "col"))
    
     Attendee 01 02 03 04 Total
         Alex  1  0  0  0     1
          Ana  0  0  0  1     1
          Bob  0  1  1  0     2
          Tim  0  0  1  0     1
       Xavier  0  1  0  0     1
        Total  1  2  2  1     6
    

    【讨论】:

      【解决方案3】:

      基础 R table

      table(rev(df[-3]))
      
      #       MeetingID
      #Attendee 01 02 03 04
      #  Alex    1  0  0  0
      #  Ana     0  0  0  1
      #  Bob     0  1  1  0
      #  Tim     0  0  1  0
      #  Xavier  0  1  0  0
      

      【讨论】:

        【解决方案4】:

        我们可以像下面这样使用xtabs

        > xtabs(~ Attendee + MeetingID, df)
                MeetingID
        Attendee 01 02 03 04
          Alex    1  0  0  0
          Ana     0  0  0  1
          Bob     0  1  1  0
          Tim     0  0  1  0
          Xavier  0  1  0  0
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2013-03-30
          • 1970-01-01
          • 2018-02-11
          • 2014-11-30
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多