在 R 中,当 ID 不唯一时,如何从每个 ID 的数据框中获取倒数第二行? [复制]

Posted

技术标签:

【中文标题】在 R 中,当 ID 不唯一时,如何从每个 ID 的数据框中获取倒数第二行? [复制]【英文标题】:In R, how can I grab the penultimate row from a data frame for each ID when IDs are non-unique? [duplicate] 【发布时间】:2014-05-11 20:56:49 【问题描述】:

我有以下格式的数据。有一个非唯一的 ID、它的显示次数以及更多数据。

我想将每个 ID 的倒数第二行添加到新表 IE a2 和 b4。

有哪些方法可以做到这一点?

ID  #   data
a   1   ...
a   2   ...
a   3   ...

b   1   ...
b   2   ...
b   3   ...
b   4   ...
b   5   ...
...

【问题讨论】:

(副本通过base R (tapply) 和data.table 得到答案。下面的plyr 答案完善了可能性。) 由于您还标记了大数据,您可能希望使用data.table 包。 mydata <- data.table(mydata);mydata2 <- mydata[,list(penult=valueyouwant[.N-1]),by="ID]; 我不是反对者,但我理解动机。你没有包括一个完整的例子。您使用的示例列名在 R 中无效。 【参考方案1】:

除了@Ben 的答案和重复答案中的答案,您还可以使用dplyr 来实现:

df %.%                 #your data.frame
 group_by(ID) %.% 
 mutate(count = 1:n()) %.% 
 filter(count %in% max(c(count-1,1))) %.%   #if each ID occures more than 1 time, you can simplify this to filter(count %in% max(count-1)) %.%
 select(-count)

这也可以写成一行:

df %.% group_by(ID) %.% mutate(count = 1:n()) %.% filter(count %in% max(c(count-1,1))) %.% select(-count)

【讨论】:

【参考方案2】:

我会使用plyr::ddply:

penult <- function(x) head(tail(x,2),1))
ddply(mydata,"ID",penult)

令我惊讶的是,这实际上在边缘情况下运行良好(每个 ID 只有一行),因为tail(x,2) 在这种情况下返回一行。

【讨论】:

【参考方案3】:
 mydata[ tapply( rownames(mydata), mydata$ID, function(n) n[ min(1, length(n)-1 ] ) ), ]

在没有有效示例的情况下不进行测试。在您的问题表述中没有考虑 ID 单行的边缘情况,因此我决定在这种情况下使用单行。

【讨论】:

以上是关于在 R 中,当 ID 不唯一时,如何从每个 ID 的数据框中获取倒数第二行? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

当唯一 id 与查询的其他 7 个不匹配时,如何从 MySQL 查询中绘制一行

在 Firebase 中使用 push() 时如何提取唯一 ID

从存储在 MYSQL 中的 C# 生成唯一 ID

如何在employee_id上 进行内部联接时获取每个唯一员工的销售总额

如何从唯一且不重复的对象映射项目

每个用户帐户的唯一 Firebase Instance-Id