我有一个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]))
答案 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)
编辑:
不是将唯一的v
与w
合并,而是获得唯一的vw
首次合并v
和w
,然后选择{的唯一值{1}}列。
DAY MONTH YEAR