【问题标题】:R programming data frame - returning value based on positionR编程数据框-根据位置返回值
【发布时间】:2015-05-04 15:44:23
【问题描述】:

我想知道是否有一种方法可以根据向量中的位置提取值,例如,我有一个包含两个向量的数据框,我将它们从原始分组按 V1 分组,然后按 V2 分组,很多就像 SQL 中的 ORDER BY 一样。当我尝试退出每个 V1 组类型的第 3 分钟时,我的问题就出现了。

有序数据框...

V1  V2
Ford    18
Ford    16
Ford    15
Ford    14
Ford    12
**Ford  5**
Ford    2
Ford    1
Nisan   10
Nisan   9
Nisan   8
Nisan   7
Nisan   6
**Nisan     5**
Nisan   4
Nisan   3
Toyota  20
Toyota  19
Toyota  15
Toyota  12
Toyota  11
**Toyota    10**
Toyota  6
Toyota  2

我想要的结果在新数据框中,每个变量的第三个最小值...

V1 V2
Ford 5
Nisan 5
Toyota 10

提前致谢。

【问题讨论】:

    标签: r aggregate group-summaries


    【解决方案1】:

    使用 base R 你可以做类似的事情

    aggregate(V2 ~ V1, df[order(df$V2), ], `[`, 3L)
    #       V1 V2
    # 1   Ford  5
    # 2  Nisan  5
    # 3 Toyota 10
    

    或者(根据@akruns 评论)使用ave

    df[with(df, ave(V2, V1, FUN = order)) == 3L,]
    

    【讨论】:

    • 谢谢。我使用了 aggregate(V2 ~ V1, df[order(df$V2), ], function(x) x[3L]) 并得到了我需要的东西!
    【解决方案2】:

    试试

    library(data.table)#v1.9.5+
    setDT(df1)[order(V2), list(V2=V2[3L]), by = V1]
    

    或者正如 @DavidArenburg 在 cmets 中提到的那样

    setDT(df1)[, .SD[frank(V2, ties.method = "dense") == 3L], by = V1]
    

    或者

    library(dplyr)
     df1 %>% 
         group_by(V1) %>%
         filter(rank(V2)==3)
    

    或者

     df1 %>%
         group_by(V1) %>% 
         arrange(V2) %>%
         slice(3L)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-09
      • 1970-01-01
      • 2022-11-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多