我有一个像这样的虚拟数据集:
x y
1 1 test1
2 2 test2
3 2 test3
4 3 test4
5 3 test5
我想根据x
中的值对其进行聚合,但是我只想显示{{1}的值的最后/第一个值,而不是连接或运行最大频率检查。 }(基于行号)。我想知道如何显示最后一个和第一个值。只需删除基于x
的重复项,就无法灵活选择x
我可以选择的值。
我的输出将是这样的(最后一次):
y
或者像这样(第一次):
x y
1 1 test1
2 2 test3
3 3 test5
我有一个1M +行的大型数据集。帮助将不胜感激。我尝试过聚合和ddply方法。
答案 0 :(得分:1)
您可以使用dplyr::distinct()
,根据变量保留唯一行,如果您将.keep_all
参数指定为TRUE
,则会获得每个不同值的第一行指定的变量:
获得第一个:
library(dplyr)
df %>%
distinct(x, .keep_all = TRUE)
# x y
#1 1 test1
#2 2 test2
#3 3 test4
要获取最后一行,您可以按照row_number()
降序排序数据框,然后使用distinct()
:
df %>%
arrange(desc(row_number())) %>%
distinct(x, .keep_all = TRUE)
# x y
#1 3 test5
#2 2 test3
#3 1 test1
答案 1 :(得分:1)
您可以使用duplicated
df[!duplicated(df$x, fromLast=TRUE),]
x y
1 1 test1
3 2 test3
5 3 test5
df[!duplicated(df$x),]
x y
1 1 test1
2 2 test2
4 3 test4
答案 2 :(得分:0)
或者,您可以使用data.table
,因为您说您的数据非常大。我给出了两个例子,对于每个第一个/最后一个值,两个都给出相同的结果。使用setkey
的方法会更快。
library(data.table)
第一个值
方法1:
dt[dt[,list(keep=.I[which.min(.I)]),by=.(x)][,keep]]
方法2:
setkey(dt,x)
dt[J(unique(x)),mult="first"]
x y
1: 1 test1
2: 2 test2
3: 3 test4
上一个值
方法1:
dt[dt[,list(keep=.I[which.max(.I)]),by=.(x)][,keep]]
方法2:
setkey(dt,x)
dt[J(unique(x)),mult="last"]
x y
1: 1 test1
2: 2 test3
3: 3 test5
数据强>
dt <- structure(list(x = c(1L, 2L, 2L, 3L, 3L), y = structure(1:5, .Label = c("test1",
"test2", "test3", "test4", "test5"), class = "factor")), .Names = c("x",
"y"), class = c("data.table", "data.frame"), row.names = c(NA,
-5L), .internal.selfref = <pointer: 0x0000000000140788>)
修改 :已在setkey()
方法中添加。