提取某些列重复但在另一列中唯一的行
Extract rows that have duplicates for certain column but are unique in another column
我正在用 R 编写一些代码。我想显示 ID 和 NAME 列重复但 AGE 值不同的行。
例如我有这个 table:
ID | NAME | AGE
111| Mark| 22
222| Anne| 21
333| Chery| 30
444| Megan| 16
555| Charles| 37
111| Mark| 23
222| Anne| 22
333| Chery| 30
111| Mark| 22
现在我有这个代码:
readfile <- read.csv(file='/home/user/shane/names.csv')
dat <- data.frame(ID=c(readfile$ID),NAME=c(readfile$NAME),AGE=c(readfile$AGE))
nam <- duplicated(dat[,c('ID','NAME)]) | duplicated(dat[,c('ID','NAME], fromLast = TRUE)
readfile[nam,]
输出如下所示:
ID | NAME | AGE
111| Mark| 22
222| Anne| 21
333| Chery| 30
111| Mark| 23
222| Anne| 22
333| Chery| 30
111| Mark| 22
我希望输出为:
ID | NAME | AGE
111| Mark| 22
222| Anne| 21
111| Mark| 23
222| Anne| 22
111| Mark| 22
我想删除 ID = 333 的列,因为它们在 Age 中具有相同的值。有人有什么建议吗?
我刚刚调整了你的代码:)
library(plyr)
dat1 <- ddply(dat, .(ID, NAME, AGE), nrow)
dat2 <- merge(dat1, dat, by=c("ID", "NAME", "AGE"))
dat3 <- dat2[!(!duplicated(dat2[, 1:2], fromLast=T) & !duplicated(dat2[, 1:2])),]
dat3[dat3$ID %in% dat3[dat3$V1 == 1, 1], 1:3]
输出为:
ID NAME AGE
1 111 Mark 22
2 111 Mark 22
3 111 Mark 23
4 222 Anne 21
5 222 Anne 22
示例数据:
dat <- data.frame(ID=c(111,222,333,444,555,111,222,333,111),
NAME=c('Mark','Anne','Chery','Megan','Charles','Mark','Anne','Chery','Mark'),
AGE=c(22,21,30,16,37,23,22,30,22))
# ID NAME AGE
#1 111 Mark 22
#2 222 Anne 21
#3 333 Chery 30
#4 444 Megan 16
#5 555 Charles 37
#6 111 Mark 23
#7 222 Anne 22
#8 333 Chery 30
#9 111 Mark 22
更新: 更正格式以便更好地阅读
一个dplyr
解决方案:
library(dplyr)
dat %>%
group_by(ID, NAME) %>%
filter(n() > 1, sum(duplicated(AGE)) == 0) %>%
ungroup()
# A tibble: 4 x 3
ID NAME AGE
<dbl> <fctr> <dbl>
1 111 Mark 22
2 222 Anne 21
3 111 Mark 23
4 222 Anne 22
我使用了@Prem 提供的数据。
这是 data.table
的选项
library(data.table)
setDT(dat)[, .SD[.N >1 & !sum(duplicated(AGE))], by = .(ID, NAME)]
# ID NAME AGE
#1: 111 Mark 22
#2: 111 Mark 23
#3: 222 Anne 21
#4: 222 Anne 22
我正在用 R 编写一些代码。我想显示 ID 和 NAME 列重复但 AGE 值不同的行。
例如我有这个 table:
ID | NAME | AGE
111| Mark| 22
222| Anne| 21
333| Chery| 30
444| Megan| 16
555| Charles| 37
111| Mark| 23
222| Anne| 22
333| Chery| 30
111| Mark| 22
现在我有这个代码:
readfile <- read.csv(file='/home/user/shane/names.csv')
dat <- data.frame(ID=c(readfile$ID),NAME=c(readfile$NAME),AGE=c(readfile$AGE))
nam <- duplicated(dat[,c('ID','NAME)]) | duplicated(dat[,c('ID','NAME], fromLast = TRUE)
readfile[nam,]
输出如下所示:
ID | NAME | AGE
111| Mark| 22
222| Anne| 21
333| Chery| 30
111| Mark| 23
222| Anne| 22
333| Chery| 30
111| Mark| 22
我希望输出为:
ID | NAME | AGE
111| Mark| 22
222| Anne| 21
111| Mark| 23
222| Anne| 22
111| Mark| 22
我想删除 ID = 333 的列,因为它们在 Age 中具有相同的值。有人有什么建议吗?
我刚刚调整了你的代码:)
library(plyr)
dat1 <- ddply(dat, .(ID, NAME, AGE), nrow)
dat2 <- merge(dat1, dat, by=c("ID", "NAME", "AGE"))
dat3 <- dat2[!(!duplicated(dat2[, 1:2], fromLast=T) & !duplicated(dat2[, 1:2])),]
dat3[dat3$ID %in% dat3[dat3$V1 == 1, 1], 1:3]
输出为:
ID NAME AGE
1 111 Mark 22
2 111 Mark 22
3 111 Mark 23
4 222 Anne 21
5 222 Anne 22
示例数据:
dat <- data.frame(ID=c(111,222,333,444,555,111,222,333,111),
NAME=c('Mark','Anne','Chery','Megan','Charles','Mark','Anne','Chery','Mark'),
AGE=c(22,21,30,16,37,23,22,30,22))
# ID NAME AGE
#1 111 Mark 22
#2 222 Anne 21
#3 333 Chery 30
#4 444 Megan 16
#5 555 Charles 37
#6 111 Mark 23
#7 222 Anne 22
#8 333 Chery 30
#9 111 Mark 22
更新: 更正格式以便更好地阅读
一个dplyr
解决方案:
library(dplyr)
dat %>%
group_by(ID, NAME) %>%
filter(n() > 1, sum(duplicated(AGE)) == 0) %>%
ungroup()
# A tibble: 4 x 3
ID NAME AGE
<dbl> <fctr> <dbl>
1 111 Mark 22
2 222 Anne 21
3 111 Mark 23
4 222 Anne 22
我使用了@Prem 提供的数据。
这是 data.table
library(data.table)
setDT(dat)[, .SD[.N >1 & !sum(duplicated(AGE))], by = .(ID, NAME)]
# ID NAME AGE
#1: 111 Mark 22
#2: 111 Mark 23
#3: 222 Anne 21
#4: 222 Anne 22