我有这个数据框:
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”的内容都位于底部,并在删除重复列表时删除?
干杯
大卫
答案 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