使用data.frame中的唯一行来对另一个data.frame进行子集化

时间:2013-12-18 21:38:15

标签: r dataframe unique subset plyr

我有一个data.frame v,我想使用

中的唯一行
#v
  DAY MONTH YEAR
1   1     1 2000
2   1     1 2000
3   2     2 2000
4   2     2 2000
5   2     3 2001

对data.frame w进行子集化。

# w
  DAY MONTH YEAR V1 V2 V3
1   1     1 2000  1  2  3
2   1     1 2000  3  2  1
3   2     2 2000  2  3  1
4   2     2 2001  1  2  3
5   3     4 2001  3  2  1

结果是data.frame vw。只有' w'与(DAY, MONTH, YEAR)中的唯一行(例如v)匹配的内容仍然存在。

# vw
  DAY MONTH YEAR V1 V2 V3
1   1     1 2000  1  2  3
2   2     2 2000  2  3  1

现在我正在使用下面的代码,我合并data.frames,然后使用ddply仅选择行的unqiue / first实例。这项工作,但如果我必须在V1=x$V1[1]部分的代码中包含ddply等所有变量,那将会变得很麻烦。有没有办法使用(DAY, MONTH, YEAR)的第一个实例和该行的其余列?

或者,是否还有另一个问题是使用从一个data.frame到另一个data.frame的唯一行?

v <- structure(list(DAY = c(1L, 1L, 2L, 2L, 2L), MONTH = c(1L, 1L, 
2L, 2L, 3L), YEAR = c(2000L, 2000L, 2000L, 2000L, 2001L)), .Names = c("DAY", 
"MONTH", "YEAR"), class = "data.frame", row.names = c(NA, -5L
))

w <- structure(list(DAY = c(1L, 1L, 2L, 2L, 3L), MONTH = c(1L, 1L, 
2L, 2L, 4L), YEAR = c(2000L, 2000L, 2000L, 2001L, 2001L), V1 = c(1L, 
3L, 2L, 1L, 3L), V2 = c(2L, 2L, 3L, 2L, 2L), V3 = c(3L, 1L, 1L, 
3L, 1L)), .Names = c("DAY", "MONTH", "YEAR", "V1", "V2", "V3"
), class = "data.frame", row.names = c(NA, -5L))

vw_example <- structure(list(DAY = 1:2, MONTH = 1:2, YEAR = c(2000L, 2000L), 
    V1 = 1:2, V2 = 2:3, V3 = c(3L, 1L)), .Names = c("DAY", "MONTH", 
"YEAR", "V1", "V2", "V3"), class = "data.frame", row.names = c(NA, 
-2L))

wv_inter <- merge(v, w, by=c("DAY","MONTH","YEAR"))

vw <- ddply(www,.(DAY, MONTH, YEAR),function(x) data.frame(DAY=x$DAY[1],MONTH=x$MONTH[1],YEAR=x$YEAR[1], V1=x$V1[1], V2=x$V2[1], V3=x$V3[1]))

3 个答案:

答案 0 :(得分:3)

 library(data.table)
 v <- data.table(v)
 w <- data.table(w)

 setkey(v)
 setkeyv(w, names(v))

 # if you want to capture ALL unique values of `v`, use: 
 w[unique(v, by=NULL)]

 # if you want only values that mutually exist in `v` and `w` use: 
 w[unique(v, by=NULL), nomatch=0L]

答案 1 :(得分:3)

在基础R中,我会先合并unique v,然后再合并。默认情况下,merge命令会合并常用列名,因此此处不需要by

vw <- merge(unique(v), w)

根据你的方法(从每个组合的第一行),我认为你可以做(​​未经测试):

vw <- ddply(www,.(DAY, MONTH, YEAR),function(x) x[1,])

答案 2 :(得分:1)

编辑:

不是将唯一的vw合并,而是获得唯一的vw首次合并vw,然后选择{的唯一值{1}}列。

DAY MONTH YEAR
相关问题