【问题标题】:Transposing values in data frame based on data in two columns根据两列中的数据转置数据框中的值
【发布时间】:2020-02-25 13:24:21
【问题描述】:

我有以下数据框。如何形成一个新的数据框/矩阵,其中每一行包含 ID 列中每个分类变量的期望值,并按时间升序获取这些值?

df <- read.csv("data.csv", header = TRUE)
> df
       ID     Time     Expectation
1         cat  1.1           1
2         dog  1.0           2
3         dog  1.1           3
4  guinea_pig  1.0           7
5         cat  1.0           1
6  guinea_pig  3.8          10
7         cat  0.8           1
8         cat  2.1           1
9         cat  3.6           1
10 guinea_pig  3.0          16
11        dog  0.9           2
12 guinea_pig  2.7          15
13 guinea_pig  4.0          10
14        dog  5.2           6
15        dog  7.2           7

例如,狗所在的行将显示为:(2, 2, 3, 6, 7)。 guinea_pig 是 (7, 15, 16, 10, 10) 等。是否可以将分类数据作为新数据框或矩阵的行名包含在内?

非常感谢!

【问题讨论】:

    标签: r dataframe matrix


    【解决方案1】:

    这是一个简单的方法:

    library(data.table)
    
    df[order(Time),list(list(Expectation)),.(ID)]
    
               ID             V1
    1:        cat      1,1,1,1,1
    2:        dog      2,2,3,6,7
    3: guinea_pig  7,15,16,10,10
    
    • Time对行进行排序
    • ID分组
    • 获取list of Expectation

    【讨论】:

      【解决方案2】:

      另一种使用dplyr的简单方法:

      library(dplyr)
      library(tidyr)
      df<-fread("
      Index ID     Time     Expectation
      1         cat  1.1           1
      2         dog  1.0           2
      3         dog  1.1           3
      4  guinea_pig  1.0           7
      5         cat  1.0           1
      6  guinea_pig  3.8          10
      7         cat  0.8           1
      8         cat  2.1           1
      9         cat  3.6           1
      10 guinea_pig  3.0          16
      11        dog  0.9           2
      12 guinea_pig  2.7          15
      13 guinea_pig  4.0          10
      14        dog  5.2           6
      15        dog  7.2           7")
      
      df %>% group_by(ID) %>% dplyr::summarise(Expectation_All =paste(Expectation, collapse = ","))
      # ID         Expectation_All
      # <chr>      <chr>          
      #   1 cat        1,1,1,1,1      
      # 2 dog        2,3,2,6,7      
      # 3 guinea_pig 7,10,16,15,10
      

      【讨论】:

      • 答案不正确。检查狗的值,您需要先对其进行排序
      • 我不知道这是否是OP想要的,但是将所有值粘贴在一起会使提取元素和进行其他操作变得困难。
      【解决方案3】:

      这是一个基本的 R 解决方案,使用 aggregate + order,即,

      aggregate(Expectation~ID,df[order(df$ID,df$Time),],FUN = list)
      

      这样

                ID       Expectation
      1        cat     1, 1, 1, 1, 1
      2        dog     2, 2, 3, 6, 7
      3 guinea_pig 7, 15, 16, 10, 10
      

      【讨论】:

        【解决方案4】:

        dplyr 版:

        df %>%
          group_by(ID) %>%
          summarise(var = list(Expectation[order(Time)]))
        
        # # A tibble: 3 x 2
        #   ID         var      
        #   <chr>      <list>   
        # 1 cat        <int [5]>
        # 2 dog        <int [5]>
        # 3 guinea_pig <int [5]>
        

        要查看内部值,请添加%&gt;% print.data.frame

        #           ID               var
        # 1        cat     1, 1, 1, 1, 1
        # 2        dog     2, 2, 3, 6, 7
        # 3 guinea_pig 7, 15, 16, 10, 10
        

        【讨论】:

          猜你喜欢
          • 2020-07-18
          • 2023-01-13
          • 1970-01-01
          • 2015-04-30
          • 1970-01-01
          • 2020-11-13
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多