在数据帧中第一次出现变量时提取所有BUT

Dan*_*Dan 1 r

我有一个数据帧,如:

ID        DATE  N  Price
 1  2013-02-04  3  29.99
 1  2013-03-18  1   9.99
 1  2013-04-13  2  19.99
 2  2013-02-18  1  18.99
 2  2013-05-11  2  19.99
Run Code Online (Sandbox Code Playgroud)

这个答案提取数据框中第一次出现变量的行告诉我们如何提取目标值的第一次出现...但是我需要所有但是第一次出现,也就是:

ID        DATE  N  Price
 1  2013-03-18  1   9.99
 1  2013-04-13  2  19.99
 2  2013-05-11  2  19.99
Run Code Online (Sandbox Code Playgroud)

建议的方法是什么?

我最初的本能是使用链接答案中概述的方法,构建一个"第一"子集,然后说,"从原始数据框,给我除了这些值之外的所有东西"......但这似乎可能更复杂.

Ric*_*ven 6

您可以非常轻松地使用data.table包执行此操作.

library(data.table)
setDT(df)[, .SD[-1], by = ID]
#    ID       DATE N Price
# 1:  1 2013-03-18 1  9.99
# 2:  1 2013-04-13 2 19.99
# 3:  2 2013-05-11 2 19.99
Run Code Online (Sandbox Code Playgroud)

df你的原始数据在哪里.这将删除每个组的第一行,按组分组ID.

另一种选择是dplyr包.

library(dplyr)
slice(group_by(df, ID), -1)
#      ID       DATE     N Price
#   (int)     (fctr) (int) (dbl)
# 1     1 2013-03-18     1  9.99
# 2     1 2013-04-13     2 19.99
# 3     2 2013-05-11     2 19.99
Run Code Online (Sandbox Code Playgroud)

这些删除所有组的第一行.如果组只有一行,则不指定应该发生的情况.如果你需要保留这些行,你需要考虑到这一点.所以让我们将一行添加为一组并进行查看.

dff <- rbind(df, df[4, ])
dff[6, 1] <- 3
Run Code Online (Sandbox Code Playgroud)

那么data.table代码就是

setDT(dff)[, .SD[if(.N == 1L) 1 else -1], by = ID]
#    ID       DATE N Price
# 1:  1 2013-03-18 1  9.99
# 2:  1 2013-04-13 2 19.99
# 3:  2 2013-05-11 2 19.99
# 4:  3 2013-02-18 1 18.99
Run Code Online (Sandbox Code Playgroud)

dplyr代码将是

slice(group_by(dff, ID), if(n() == 1L) 1 else -1)
#      ID       DATE     N Price
#   (dbl)     (fctr) (int) (dbl)
# 1     1 2013-03-18     1  9.99
# 2     1 2013-04-13     2 19.99
# 3     2 2013-05-11     2 19.99
# 4     3 2013-02-18     1 18.99
Run Code Online (Sandbox Code Playgroud)

对于那些情况.

数据:

df <- structure(list(ID = c(1L, 1L, 1L, 2L, 2L), DATE = structure(c(1L, 
3L, 4L, 2L, 5L), .Label = c("2013-02-04", "2013-02-18", "2013-03-18", 
"2013-04-13", "2013-05-11"), class = "factor"), N = c(3L, 1L, 
2L, 1L, 2L), Price = c(29.99, 9.99, 19.99, 18.99, 19.99)), .Names = c("ID", 
"DATE", "N", "Price"), class = "data.frame", row.names = c(NA, 
-5L))
Run Code Online (Sandbox Code Playgroud)


Ott*_*met 5

如果您不想使用附加软件包:

df[duplicated(df$ID),]
Run Code Online (Sandbox Code Playgroud)