4

我正在尝试从数据集中提取 和 的每个组合的第一条SUBJ记录。简化的集合 sampleData 是:BLKTR

SUBJ BLK TR    BEG    END
1  1234   1  1 111021 111021
2  1234   1  1 111400 111021
3  1234   1  1 111566 111021
4  1234   1  1 111765 111021
5  1234   2  2 132050 133113
6  1234   2  2 133123 133113
7  1234   2  2 133479 133113
8  1234   2  2 133762 133113
9  5678   1  1  82503  82502
10 5678   1  1  82902  82502
11 5678   1  1  83102  82502
12 5678   1  1  83310  82502
13 5678   2  2 274870 288224
14 5678   2  2 288225 288224
15 5678   2  2 288535 288224
16 5678   2  2 288802 288224

当我尝试这个时:

ddplyFirst <- ddply(sampleData, .(SUBJ, BLK, TR), summarize, 
                        Tr.match = match(unique(TR), TR))

我明白了:

ddplyFirst
  SUBJ BLK TR Tr.match
1 1234   1  1        1
2 1234   2  2        1
3 5678   1  1        1
4 5678   2  2        1

我不知道如何从这个到我想要得到的,这将包括BEGandEND值或BEG - END.

现在,事实证明,在上面的例子中,END是一个唯一的数字,所以我可以这样做:

first <- with(sampleData, match(unique(END), END))

这给了我:

sampleData[first,]
   SUBJ BLK TR    BEG    END
1  1234   1  1 111021 111021
5  1234   2  2 132050 133113
9  5678   1  1  82503  82502
13 5678   2  2 274870 288224

问题是完整的数据集有202,616 条记录,我不能保证BEG或对于、和END的不同组合具有唯一值。SUBJBLKTR

另外,我想学习如何解决更一般的情况,对我来说,现在将获得每个 、 和组合中的第一SUBJBLK记录TR

当然,更一般的情况是在每个、和combo中获取第 n 条记录。如果有人能告诉我如何做这些“更”通用或“最”通用解决方案中的一个或另一个,我将不胜感激。SUBJBLKTR

4

5 回答 5

3

此处无需使用summarise,可以这样做(head用于获取第一行)

 ddply(sampleData, .(SUBJ, BLK, TR), function(x) head(x,1))
  SUBJ BLK TR    BEG    END
1 1234   1  1 111021 111021
2 1234   2  2 132050 133113
3 5678   1  1  82503  82502
4 5678   2  2 274870 288224

或者更一般地获得第 n 行。n 你可以这样做:

ddply(sampleData, .(SUBJ, BLK, TR), function(x) x[min(row.n,nrow(x),])
于 2013-02-23T16:27:48.210 回答
2

您可以通过仅对其进行索引来访问第一条或第 n 条记录(假设nth每个组都存在索引):

idx <- 2
ddply(sampleData, .(SUBJ, BLK, TR), summarise, BEG=BEG[idx], END=END[idx])

#   SUBJ BLK TR    BEG    END
# 1 1234   1  1 111400 111021
# 2 1234   2  2 133123 133113
# 3 5678   1  1  82902  82502
# 4 5678   2  2 288225 288224
于 2013-02-23T16:23:28.493 回答
1

data.table编码优雅(和一般效率)的解决方案

如果您获得除第一行以外的任何行(并且每个子组中可能有不同的数字行),那么您将需要考虑当您尝试获得不存在的行时会发生什么。

下面的解决方案将获得min(`n`, `total#of rows in each group`))每个组的

library(data.table)
DT <- data.table(sampleData)

# get the the row you want. This may 
#
index <- 2L
 DT[,{ idx <- min(index, .N); .SD[idx,]} ,by =list(SUBJ, BLK, TR)] 
于 2013-02-24T22:57:31.293 回答
0

这是aggregate一般情况的解决方案:

aggregate(. ~ SUBJ+BLK+TR, data=sampleData, FUN='[', 1)
##   SUBJ BLK TR    BEG    END
## 1 1234   1  1 111021 111021
## 2 5678   1  1  82503  82502
## 3 1234   2  2 132050 133113
## 4 5678   2  2 274870 288224


aggregate(. ~ SUBJ+BLK+TR, data=sampleData, FUN='[', 2)
##   SUBJ BLK TR    BEG    END
## 1 1234   1  1 111400 111021
## 2 5678   1  1  82902  82502
## 3 1234   2  2 133123 133113
## 4 5678   2  2 288225 288224
于 2013-02-23T16:46:10.997 回答
0

在特定情况下(获取第一行或最后一行),您可以使用以下功能duplicated

sampleData[!duplicated(sampleData[,c("SUBJ","BLK","TR")],fromLast=FALSE),]
于 2013-02-23T16:52:42.397 回答