根据R中的列聚合字符串,仅保留第一个/最后一个

时间:2016-10-19 19:51:42

标签: r aggregate plyr

我有一个像这样的虚拟数据集:

  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方法。

3 个答案:

答案 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()方法中添加。