【问题标题】:In R, how can I change the location of row and column?在 R 中,如何更改行和列的位置?
【发布时间】:2020-04-27 13:05:09
【问题描述】:

我有这个原始数据集,下面是示例数据集:

 X1         X2
 1      Born 1946-05-27
 2  bioguide    A000370
 3      Born 1979-06-19
 4  bioguide    A000371
 5      Born 1980-04-18
 6  bioguide    A000367
 7      Born 1958-06-12
 8  bioguide    A000369
 9      Born 1948-03-23
 10 bioguide    B001291

使用这个,我想要的输出如下:

       Born        biouguide
1     1946-05-27     A000370
2     1979-06-19     A000371
3     1980-04-18     A000367
4     1958-06-12     A000369
5     1980-04-18     A000367

另外,以下是原始数据集的输出:

structure(list(X1 = c("Born", "bioguide", "Born", "bioguide", 
"Born", "bioguide", "Born", "bioguide", "Born", "bioguide"), 
    X2 = c("1946-05-27", "A000370", "1979-06-19", "A000371", 
    "1980-04-18", "A000367", "1958-06-12", "A000369", "1948-03-23", 
    "B001291")), row.names = c(NA, 10L), class = "data.frame")

你能帮我做出想要的输出吗?

【问题讨论】:

    标签: r dplyr tidyr


    【解决方案1】:

    使用 data.table,您可以使用 rowid(X1) 作为行,X1 作为列名,X2 作为值,然后删除 rowid(X1) 之后的行。

    library(data.table)
    setDT(df)
    
    dcast(df, rowid(X1) ~ X1, value.var = 'X2')[, -1]
    
    #          Born bioguide
    # 1: 1946-05-27  A000370
    # 2: 1979-06-19  A000371
    # 3: 1980-04-18  A000367
    # 4: 1958-06-12  A000369
    # 5: 1948-03-23  B001291
    

    【讨论】:

      【解决方案2】:

      一个base R 选项可以是:

      data.frame(Born = df[c(TRUE, FALSE), 2],
                 biouguide = df[c(FALSE, TRUE), 2])
      
              Born biouguide
      1 1946-05-27   A000370
      2 1979-06-19   A000371
      3 1980-04-18   A000367
      4 1958-06-12   A000369
      5 1948-03-23   B001291
      

      【讨论】:

      • 有点限制但很聪明
      【解决方案3】:

      这是一个基本的 R 解决方案

      dfout <- `names<-`(data.frame(matrix(df$X2,ncol = 2,byrow = T)),unique(df$X1))
      

      这样

      > dfout
              Born bioguide
      1 1946-05-27  A000370
      2 1979-06-19  A000371
      3 1980-04-18  A000367
      4 1958-06-12  A000369
      5 1948-03-23  B001291
      

      【讨论】:

        【解决方案4】:

        我们可以使用pivot_wider

        library(dplyr)
        library(tidyr)
        df1 %>%
          group_by(X1) %>%
          mutate(rn = row_number()) %>%
          pivot_wider(names_from = X1, values_from = X2) %>%
          select(-rn)
        # A tibble: 5 x 2
        #  Born       bioguide
        #  <chr>      <chr>   
        #1 1946-05-27 A000370 
        #2 1979-06-19 A000371 
        #3 1980-04-18 A000367 
        #4 1958-06-12 A000369 
        #5 1948-03-23 B001291 
        

        或在base R

        unstack(df1, X2 ~ X1)
        

        【讨论】:

        • 不知道unstack 这个功能,厉害。
        猜你喜欢
        • 1970-01-01
        • 2021-11-21
        • 2021-11-27
        • 2020-04-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-11-06
        相关资源
        最近更新 更多