根据R中的标准对数据帧进行重复数据删除?

时间:2012-11-29 10:23:04

标签: r sorting duplicates

我有这个数据框:

    Name    Country Gender  Age
1   John      GB      M     25
2   Mark      US      M     35
3   Jane      0       0      0
4   Jane      US      F     30
5   Jane      US      F      0
6   Kate      GB      F     18

正如您所看到的,“Jane”的值出现了3次。我想要做的是根据变量“名称”对列表进行重复数据删除,但由于其余列对我很重要,我希望保留其中包含最多信息的行。例如,如果我要在excel中对上述文件进行重复数据删除,它将保留“Jane”的第一个值并删除所有其他值。但是“Jane”(第3行)的第一个值在其他列中缺少信息。

因此换句话说,我希望通过“名称”对列表进行重复数据删除,但添加一个条件以保持“Age”列中任何其他值与“0”不同的行。这样我得到的结果就是:

    Name    Country Gender  Age
1   John       GB     M     25
2   Mark       US     M     35
3   Jane       US     F     30
4   Kate       GB     F     18

我试过这个

file3 <- file1[!duplicated(file1$Name),]

但是像excel一样,它保留了“Jane”的值,在其他列中没有可用的信息。

如何根据Z-A顺序中的“Age”列对行进行排序,以便任何具有“0”的内容都位于底部,并在删除重复列表时删除?

干杯

大卫

2 个答案:

答案 0 :(得分:3)

尝试这个技巧

ind <- with(DF, 
        Country !=0 &
        Gender %in% c('F', 'M') &
        Age !=0)

DF[ind, ]
  Name Country Gender Age
1 John      GB      M  25
2 Mark      US      M  35
4 Jane      US      F  30
6 Kate      GB      F  18

到目前为止它运作良好并产生您想要的输出

修改

 library(doBy)
    orderBy(~ -Age+Name, DF) # Sort decreasingly by Age and Name

  Name Country Gender Age
2 Mark      US      M  35
4 Jane      US      F  30
1 John      GB      M  25
6 Kate      GB      F  18
3 Jane       0      0   0
5 Jane      US      F   0

或者只是使用基本功能:

DF[order(DF$Age, DF$Name, decreasing = TRUE), ]
  Name Country Gender Age
2 Mark      US      M  35
4 Jane      US      F  30
1 John      GB      M  25
6 Kate      GB      F  18
3 Jane       0      0   0
5 Jane      US      F   0

现在您可以通过索引符合条件的正确行来进行选择,我认为第一部分比这两个部分更好。

答案 1 :(得分:1)

如果所有重复的行在Age列中的值为零,则它将与subset一起使用:

# the data
file1 <- read.table(text="Name    Country Gender  Age
1   John      GB      M     25
2   Mark      US      M     35
3   Jane      0       0      0
4   Jane      US      F     30
5   Jane      US      F      0
6   Kate      GB      F     18", header = TRUE, stringsAsFactors = FALSE)

# create a subset of the data
subset(file1, Age > 0)

#   Name Country Gender Age
# 1 John      GB      M  25
# 2 Mark      US      M  35
# 4 Jane      US      F  30
# 6 Kate      GB      F  18