2017-07-02 37 views
3

我正在R中進行一些編碼。我想要顯示對列ID和NAME具有重複但行爲不同的AGE的行。提取對某些列有重複但在另一列中唯一的行

例如,我有這個表:

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中具有相同的值。有人會有什麼建議嗎?

+0

我很困惑的選擇。你如何達到理想的輸出?通過過濾原始或過濾掉重複項目的對象?沒有'ID = 33',只有'333'。 –

+0

嗨,對不起,如果我不清楚。這將是您過濾掉重複項的對象。然後顯示所有不一致的年齡。例如,如果同一個id和name的年齡是22,23,22。我想要顯示這些行。對不起我的英語不好。 – shia1717

回答

6

我只是調整了你的代碼:)

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)) 
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] 

希望這有助於!

(編輯後@ shia1717此溶液中提到他的具體要求 - 參見評論部分,用於更詳細地)

+0

謝謝!只是在添加另一行時出現一些問題。 (ID = c(111,222,333,444,555,111,222,333,111),NAME = c('Mark','Anne','奇瑞','Megan','Charles','Mark','Anne','奇瑞','Mark'),AGE = C(22,21,30,16,37,23,22,30,22))。如果年齡爲22,23,22,它將取出兩個111。只剩下其中的一個,我希望所有這些都包含在內,因爲它們沒有一致的年齡。對不起,我只是新來的R.真的很感謝所有幫助 – shia1717

+0

'dat1 < - unique(dat [!(!duplicated(dat [,1:2],fromLast = T)&!duplicated(dat [,1:2 ])),]); dat1 [!(!duplicated(dat1 [,1])&!duplicateated(dat1 [,1],fromLast = T)),]' – Prem

+0

試過這個,但是隻有2個id出現111。我打算展示三個111s,因爲它們不一致。對不起,如果我不清楚。感謝您的幫助。 ID | NAME | AGE 111 |馬克| 22 222 |安妮| 21 111 |馬克| 23 222 |安妮| 22 111 |馬克| 22 – shia1717

1

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友情提供的數據。

1

這裏是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 
相關問題