0

3列のデータフレームがあります

df <- data.frame(ID1=c(rep(1,4),rep(2,4)), ID2=rep(1:2,4), value=1:8)

各グループ (ID1、ID2) の最小値と、元のテーブルでのこの最小値の位置 (row.name) を回復する必要があります。

group_by と summarise を使用して min を取得しましたが、summary が集計されておらず、グループに使用されていない列を取り除くため、位置を取得する方法がわかりません。

df<-data.frame(ID1=c(rep(1,4),rep(2,4)), ID2=rep(1:2,4), value=1:8)
df[['X']] <- paste0(df$ID1,'.',df$ID2)
df <- group_by( df, X )
df <- summarise( df, Objective=min(value)  )

これを解決して取得する方法についてのアイデアはありますか?

    X Objective Position
1 1.1         1        1
2 1.2         2        2
3 2.1         5        5
4 2.2         6        6

前もって感謝します

4

3 に答える 3

3

私が正しく理解していれば、すでに dplyr を使用しているので、次のようにすることができます。

library(dplyr); library(tidyr)
unite(df, X, ID1:ID2, sep = ".") %>% 
     mutate(Position = row_number()) %>% 
     group_by(X) %>% slice(which.min(value))

#Source: local data frame [4 x 3]
#Groups: X
#
#    X value Position
#1 1.1     1        1
#2 1.2     2        2
#3 2.1     5        5
#4 2.2     6        6

または、代わりに(dplyrのみ)-私はむしろこれを使用したい:

mutate(df, Position = row_number()) %>% group_by(ID1, ID2) %>% slice(which.min(value))
#Source: local data frame [4 x 4]
#Groups: ID1, ID2
#
#  ID1 ID2 value Position
#1   1   1     1        1
#2   1   2     2        2
#3   2   1     5        5
#4   2   2     6        6

データ

df <- data.frame(ID1=rep(1:2, each = 4), ID2=rep(1:2,4), value=1:8)
于 2014-12-23T08:25:04.427 に答える
2

これを使用してこれにアプローチする方法は次のとおりですdata.tablern行番号になります)。

library(data.table)
setDT(df, keep.rownames = TRUE)[, .SD[which.min(value)], list(ID1, ID2)]
#    ID1 ID2 rn value
# 1:   1   1  1     1
# 2:   1   2  2     2
# 3:   2   1  5     5
# 4:   2   2  6     6

別のオプションは、順序付けしてから一意の値を選択することです

unique(setorder(df, value), by = c("ID1", "ID2"))
#    ID1 ID2 rn value
# 1:   1   1  1     1
# 2:   1   2  2     2
# 3:   2   1  5     5
# 4:   2   2  6     6

Xどちらの方法でも、列を作成する必要はありません

またはベースRを使用

df <- df[order(df$value), ]
df[!duplicated(df[, 1:2]), ]
#   ID1 ID2 value
# 1   1   1     1
# 2   1   2     2
# 5   2   1     5
# 6   2   2     6

データ

df <- data.frame(ID1=c(rep(1,4),rep(2,4)), ID2=rep(1:2,4), value=1:8)
于 2014-12-23T08:47:10.357 に答える