如何删除唯一条目并在R中保留重复项

时间:2015-08-27 21:20:09

标签: r

public static string SerializeToXml<T>(T ThisTypeInstance)
{
    System.Text.StringBuilder sb = new System.Text.StringBuilder();
    string strReturnValue = null;

    //SerializeToXml<T>(ThisTypeInstance, new System.IO.StringWriter(sb));
    SerializeToXml<T>(ThisTypeInstance, new StringWriterWithEncoding(sb, System.Text.Encoding.UTF8));

    strReturnValue = sb.ToString();
    sb = null;

    return strReturnValue;
} // End Function SerializeToXml

我需要帮助学习如何删除文件中的唯一行,同时保留重复项或重复项。例如,输出应如下所示:

ID     Cat1  Cat2    Cat3   Cat4
A0001   358 11.25   37428   0
A0001   279 14.6875 38605   0
A0013   367 5.125   40152   1
A0014   337 16.3125 38624   0
A0020   367 8.875   37797   0
A0020   339 9.625   39324   0

如果你能给我建议如何处理这个问题,非常感谢。

感谢大家的建议。我想计算重复测量之间不同类别(即Cat2,Cat 3)的值差异(通过唯一ID)。将不胜感激任何建议。

3 个答案:

答案 0 :(得分:9)

一般性评论。

  • 此处ave方法是唯一保留数据初始行排序的方法。
  • by方法应该非常慢。我怀疑data.table和dplyr在选择组时比avetapply(还)快得多。基准来证明我的错误欢迎!

基础R (感谢前两种方法的@thelatemail。)

1)为每一行分配其df$ID组的长度,我们根据长度向量进行过滤。

df[ ave(1:nrow(df), df$ID, FUN=length) > 1 , ]

2)或者,我们按df$ID分割行名或数字,选择要保留的组行。 tapply返回一组行列表,因此我们必须unlist将它们放入一行行中。

df[ unlist(tapply(1:nrow(df), df$ID, function(x) if (length(x) > 1) x)) , ]

以下是一种更糟糕的方法,但与您在data.table和dplyr中所看到的更为相似:

3)数据按df$ID分割,保留每个数据子集SD(如果有多行)。 by会返回一个列表,因此我们必须rbind将它们重新组合在一起。

do.call( rbind, c(list(make.row.names = FALSE),
    by(df, df$ID, FUN=function(SD) if (nrow(SD) > 1) SD )))

data.table .N对应nrow组内的by=ID;并且.SD是数据的子集。

library(data.table)
setDT(df)[, if (.N>1) .SD, by=ID]

#       ID Cat1    Cat2  Cat3 Cat4
# 1: A0001  358 11.2500 37428    0
# 2: A0001  279 14.6875 38605    0
# 3: A0020  367  8.8750 37797    0
# 4: A0020  339  9.6250 39324    0

dplyr n()对应nrow组中的group_by(ID)

library(dplyr)
df %>% group_by(ID) %>% filter( n() > 1 )

# Source: local data frame [4 x 5]
# Groups: ID
# 
#      ID Cat1    Cat2  Cat3 Cat4
# 1 A0001  358 11.2500 37428    0
# 2 A0001  279 14.6875 38605    0
# 3 A0020  367  8.8750 37797    0
# 4 A0020  339  9.6250 39324    0

答案 1 :(得分:8)

基础R中使用duplicated

的另一个选项
dx[dx$ID %in% dx$ID[duplicated(dx$ID)],]

#      ID Cat1    Cat2  Cat3 Cat4
# 1 A0001  358 11.2500 37428    0
# 2 A0001  279 14.6875 38605    0
# 5 A0020  367  8.8750 37797    0
# 6 A0020  339  9.6250 39324    0

data.table使用重复的

使用duplicatedfromLast版本:

library(data.table)
setkey(setDT(dx),ID) # or with data.table 1.9.5+: setDT(dx,key="ID")
dx[duplicated(dx) |duplicated(dx,fromLast=T)]

#       ID Cat1    Cat2  Cat3 Cat4
# 1: A0001  358 11.2500 37428    0
# 2: A0001  279 14.6875 38605    0
# 3: A0020  367  8.8750 37797    0
# 4: A0020  339  9.6250 39324    0

这也可以应用于基础R,但我更喜欢data.table这里的语法糖。

答案 2 :(得分:0)

我知道这是一个老问题,但我遇到了同样的问题,发现这个解决方案最简单:

data<- data[duplicated(data$ID)]