关于R中的聚合

关于R中的聚合,r,aggregate,R,Aggregate,每个“KCL_ID”都有几个不同的“天”KCL_ID=c(21L、21L、21L、22L、22L、22L……),DAYS=c(1449、1814、582、582、947、183……)我想做的是,使用聚合,为每个“KCL_ID”获取最小的“天”,并列出“BMI”BMI=c(26.4、28.7、32、25.3、25.2、25.7……)正确对应最小的“天数” 所以,我想得到的是: KCL_ID DAYS BMI 1 21 582 32.0 2 22 183 25.7

每个“KCL_ID”都有几个不同的“天”
KCL_ID=c(21L、21L、21L、22L、22L、22L……),DAYS=c(1449、1814、582、582、947、183……)
我想做的是,使用聚合,为每个“KCL_ID”获取最小的“天”,并列出“BMI”
BMI=c(26.4、28.7、32、25.3、25.2、25.7……)
正确对应最小的“天数” 所以,我想得到的是:

   KCL_ID DAYS BMI 
1     21  582  32.0  
2     22  183  25.7
3     61    0  21.0
4     62    0  38.5
5     71  109  27.2
6     72  109  22.6
但当我使用此代码时:

aggregate(DAYS~KCL_ID+BMI, data = A, min)
我得到以下结果:

   KCL_ID  BMI DAYS
1      61 20.1  399
2      61 21.0    0
3      72 22.6  109
4      72 23.9  474
5      62 24.2 1461
6      61 25.0  365
7      22 25.2  947
8      22 25.3  582
9      22 25.7  183
10     61 25.8  731
11     62 26.3 1096
12     21 26.4 1449
13     61 26.4 1096
14     61 26.8 1461
15     62 27.2 1826
16     71 27.2  109
17     62 27.5 2192
18     71 28.6  474
19     21 28.7 1814
20     71 29.2  840
21     61 29.5 2192
22     61 29.7 1826
23     21 32.0  582
24     62 34.8  731
25     62 37.0  365
26     62 38.5    0

有人知道如何解决这个问题吗?

R中的Dplyr包对于这个问题非常有用

library(dplyr)

dfx <- data.frame(
KCL_ID = c(21L, 21L, 21L, 22L, 22L, 22L),
DAYS = c(1449, 1814, 582, 582, 947, 183),
BMI = c(26.4, 28.7, 32, 25.3, 25.2, 25.7)
)

dfx %>% #read the %>% as "then do"
  group_by(KCL_ID)%>% 
  summarise( smallestDays = min(DAYS))%>% # find the smallest days
  left_join(dfx, by = c("smallestDays" ="DAYS", "KCL_ID" = "KCL_ID"))%>% as.data.frame() #Joining on both columns should give you what you need
解释

  • 使用
    aggregate
    获取
    DAYS
    min
    ,仅按
    KCL\u ID
    分组

  • 使用
    merge
    添加回与此子集匹配的原始列。(它默认为内部联接,在本例中有效,因为子集中的所有行都是原始行,您不希望添加与子集不匹配的原始行。此外,默认情况下,
    merge
    通过重叠列名联接,这是完美的)


    • OP非常接近解决方案。公式应保存为
      聚合中的
      天~KCL\u ID
      。然后将
      DAYS
      KCL\u ID
      列与原始数据帧合并

      merge(df, aggregate(DAYS ~ KCL_ID, data = df, min), by = c("DAYS", "KCL_ID"))
      #   DAYS KCL_ID  BMI
      # 1  183     22 25.7
      # 2  582     21 32.0
      
      数据

      df <- data.frame(KCL_ID = c(21L, 21L, 21L, 22L, 22L, 22L),
      DAYS = c(1449, 1814, 582, 582, 947, 183),
      BMI = c(26.4, 28.7, 32, 25.3, 25.2, 25.7))
      

      df我非常感谢这个问题的详细数据。对这个答案添加一些注释将对OP和未来的访问者更有帮助。@Jordi感谢您的详细回复。这真的很有用。@Tseng注意,如果在原始数据帧中碰巧有多个匹配项与子集匹配,结果将相应地有重复项。是的,这就是我想要的!谢谢你的回复。
      
      merge(df, aggregate(DAYS ~ KCL_ID, data = df, min), by = c("DAYS", "KCL_ID"))
      #   DAYS KCL_ID  BMI
      # 1  183     22 25.7
      # 2  582     21 32.0
      
      df <- data.frame(KCL_ID = c(21L, 21L, 21L, 22L, 22L, 22L),
      DAYS = c(1449, 1814, 582, 582, 947, 183),
      BMI = c(26.4, 28.7, 32, 25.3, 25.2, 25.7))