【问题标题】:In R, how can I grab the penultimate row from a data frame for each ID when IDs are non-unique? [duplicate]在 R 中,当 ID 不唯一时,如何从每个 ID 的数据框中获取倒数第二行? [复制]
【发布时间】: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 中无效。

标签: r dataframe bigdata


【解决方案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 单行的边缘情况,因此我决定在这种情况下使用单行。

      【讨论】:

        猜你喜欢
        • 2017-01-16
        • 2018-07-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多