在 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