R:具有最大值的子集/组数据帧?

时间:2015-01-21 01:50:24

标签: r dataframe greatest-n-per-group rdata

给出这样的数据框:

  gid set  a  b
1   1   1  1  9
2   1   2 -2 -3
3   1   3  5  6
4   2   2 -4 -7
5   2   6  5 10
6   2   9  2  0

如何对具有最大gid值且1/0的唯一set的数据框进行子集/分组,其a值大于其b值?

所以在这里,它是,呃......

1,3,0
2,9,1

在SQL中有点愚蠢的简单但我希望能更好地控制我的R,所以......

3 个答案:

答案 0 :(得分:5)

dplyr的小蛋糕:

dat <- read.table(text="gid set  a  b
1   1  1  9
1   2 -2 -3
1   3  5  6
2   2 -4 -7
2   6  5 10
2   9  2  0", header=TRUE)

library(dplyr)

dat %>%
  group_by(gid) %>%
  filter(row_number() == which.max(set)) %>%
  mutate(greater=a>b) %>%
  select(gid, set, greater)

## Source: local data frame [2 x 3]
## Groups: gid
## 
##   gid set greater
## 1   1   3   FALSE
## 2   2   9    TRUE

如果确实需要10以及dplyr 群组引起任何焦虑:

dat %>%
  group_by(gid) %>%
  filter(row_number() == which.max(set)) %>%
  mutate(greater=ifelse(a>b, 1, 0)) %>%
  select(gid, set, greater) %>%
  ungroup

## Source: local data frame [2 x 3]
## 
##   gid set greater
## 1   1   3       0
## 2   2   9       1

你可以在没有管道的情况下做同样的事情:

ungroup(
  select(
    mutate(
      filter(row_number() == which.max(set)), 
      greater=ifelse(a>b, 1, 0)), gid, set, greater))

但是......但是...... 为什么?! : - )

答案 1 :(得分:3)

假设您的原始数据被称为data.table,这是df的可能性。

library(data.table)

setDT(df)[, .(set = max(set), b = as.integer(a > b)[set == max(set)]), gid]
#    gid set b
# 1:   1   3 0
# 2:   2   9 1

请注意,为了考虑多个max(set)行,我使用了set == max(set)作为子集,这样就会返回相同数量的行,这些行与max有关系(如果有任何意义的话)在所有)。

由@thelatemail提供,另一个数据表选项:

setDT(df)[, list(set = max(set), ab = (a > b)[which.max(set)] + 0), by = gid]
#    gid set ab
# 1:   1   3  0
# 2:   2   9  1

答案 2 :(得分:1)

base R中,您可以使用ave

indx <- with(df, ave(set, gid, FUN=max)==set)
#in cases of ties
#indx <- with(df, !!ave(set, gid, FUN=function(x) 
#                  which.max(x) ==seq_along(x)))


transform(df[indx,], greater=(a>b)+0)[,c(1:2,5)]
#   gid set greater
# 3   1   3       0
# 6   2   9       1