【问题标题】:Handle a table with ID repetition处理 ID 重复的表
【发布时间】:2015-05-01 14:00:57
【问题描述】:

我不是 R 初学者,但我真的很难解决我的问题。我的问题是:我有一个数据框(这里是一个例子)。

id name dateA 
1   A   150
1   A   160
2   B   110
2   B   1009
2   B   098
2   B   309
3   C   218
3   C   310
4   D   219

我想创建 3 个新列(minA、maxA、repA)

minA == min(of dateA for each id)
maxA == max(of dateA for each id)
repA == number of repetition for each id;


id name dateA minA maxA repA
1   A   150
1   A   160
2   B   110
2   B   1009
2   B   098
2   B   309
3   C   218
3   C   310
4   D   219

感谢您的帮助。希望我足够清楚。

【问题讨论】:

  • 您可能需要说明您的问题/卡在哪里。

标签: r


【解决方案1】:

你可以试试

library(data.table)#v1.9.5+
setDT(df1)[,c('minA', 'maxA', 'repA') := list(min(dateA), max(dateA), 
                    .N) , by= id]

更新

对于更新的数据集,我们像以前一样创建列“minA”、“maxA”、“repA”。通过将 (:=) 分配给按“id”分组的 min(dateA)max(dateA).N。将键列设置为'id'(setkey(.., id)),与将'long'重新整形为'wide'格式(dcast(df2, ..))获得的输出连接

  setkey(setDT(df2)[, c('minA', 'maxA', 'repA') := list(min(dateA),
        max(dateA), .N) , by= id], id)[
          dcast(df2, id~typeP, value.var='typeP', length)]
  #    id name dateA typeP minA maxA repA P1 P2 P3
  #1:  1    A   150    P1  150  160    2  2  0  0
  #2:  1    A   160    P1  150  160    2  2  0  0
  #3:  2    B   110    P2   98 1009    4  1  3  0
  #4:  2    B  1009    P2   98 1009    4  1  3  0
  #5:  2    B    98    P1   98 1009    4  1  3  0
  #6:  2    B   309    P2   98 1009    4  1  3  0
  #7:  3    C   218    P2  218  310    2  0  1  1
  #8:  3    C   310    P3  218  310    2  0  1  1
  #9:  4    D   219    P1  219  219    1  1  0  0

数据

df1 <- structure(list(id = c(1L, 1L, 2L, 2L, 2L, 2L, 3L, 3L, 4L),
 name = c("A", 
"A", "B", "B", "B", "B", "C", "C", "D"), dateA = c(150L, 160L, 
110L, 1009L, 98L, 309L, 218L, 310L, 219L)), .Names = c("id", 
"name", "dateA"), class = "data.frame", row.names = c(NA, -9L))

df2 <- structure(list(id = c(1L, 1L, 2L, 2L, 2L, 2L, 3L, 3L, 4L), 
 name = c("A", 
"A", "B", "B", "B", "B", "C", "C", "D"), dateA = c(150L, 160L, 
110L, 1009L, 98L, 309L, 218L, 310L, 219L), typeP = c("P1", "P1", 
"P2", "P2", "P1", "P2", "P2", "P3", "P1")), .Names = c("id", 
"name", "dateA", "typeP"), class = "data.frame",
 row.names = c(NA, -9L))

【讨论】:

    【解决方案2】:

    使用 dplyr

    require(dplyr)    
    Data <- Data %>%
          group_by(id) %>%
          mutate(minA = min(dateA), maxA  = max(dateA), repA = n())
    

    > Data
    Source: local data frame [9 x 6]
    Groups: id
    
      id name dateA minA maxA repA
    1  1    A   150  150  160    2
    2  1    A   160  150  160    2
    3  2    B   110   98 1009    4
    4  2    B  1009   98 1009    4
    5  2    B    98   98 1009    4
    6  2    B   309   98 1009    4
    7  3    C   218  218  310    2
    8  3    C   310  218  310    2
    9  4    D   219  219  219    1
    

    【讨论】:

      【解决方案3】:

      你可以使用data.table如下:

      setDT(dat)
      setkey(dat, id) #this makes the last line join on id
      agg_dat <- dat[,.(minA = min(dateA), maxA = max(dateA), repA = .N), by = id]
      dat[agg_dat]
      

      agg_dat 保存聚合数据,dat[agg_dat] 通过 id 将聚合数据连接到数据集。

      【讨论】:

        猜你喜欢
        • 2012-08-10
        • 2019-02-23
        • 2022-01-09
        • 1970-01-01
        • 2021-04-03
        • 2012-02-22
        • 1970-01-01
        • 2013-03-21
        • 1970-01-01
        相关资源
        最近更新 更多