2014-09-21 5 views
3
내가 데이터 프레임,

2 열 조건에 따라 중복 제거

그래서 다른 열에서 최대 값을 기준으로 데이터 프레임에서 중복 행을 제거하는 것을 시도하고있다

:

df<-data.frame (rbind(c("a",2,3),c("a",3,4),c("a",3,5),c("b",1,3),c("b",2,6),c("r",4,5)) 
    colnames(df)<-c("id","val1","val2") 

id val1 val2 

    a 2 3 

    a 3 4 

    a 3 5 

    b 1 3 

    b 2 6 

    r 4 5 

나는 것 같은 행에 대해 val2에 대한 최대 값을 가지지 않는 조건으로 모든 중복을 ID로 계속 제거하려고합니다.

따라서 데이터 프레임이되어야 :

a 3 5 

    b 2 6 

    r 4 5 

-> 모든 중복을 제거하지만, 최대 서브 세트에 대한 DF $으로의 val2만큼 가치 (DF, DF $으로 자료 == "A")으로 열을 유지

답변

2

을 사용하는 것입니다. 여기에서 열은 factors입니다. 확인 나는 당신의 데이터가 정말

df <- data.frame (id = c(rep("a", 3), rep("b", 2), "r"), 
        val1 = c(2, 3, 3, 1, 2, 4), val2 = c(3, 4, 5, 3, 6, 5)) 

를 설정 희망 어떻게 당신은 split 할 수있어 여기에 dplyr

library(dplyr) 
df %>% 
    group_by(id) %>% 
    filter(val2==max(val2)) 
# id val1 val2 
#1 a 3 5 
#2 b 2 6 
#3 r 4 5 
+0

아마도 mutate (val2 = as.numeric (as.character (val2))) %> %를 추가해야 할 것입니다. 'dplyr' 솔루션에 –

+0

@David Arenburg 이전 해결책에서 변환 된'df'를 사용했습니다. 예, 당신은 그것에 대해 옳았습니다. 그러나 OP가 예를 구성하는 데 실수를했을 수도 있습니다. – akrun

+0

(+1) 두 가지를 모두 게시하기 전에 두 번째로 갈 예정입니다 :) –

5

한 가지 가능한 방법은 base R를 사용 data.table

library(data.table) 
setDT(df)[, .SD[which.max(val2)], by = id] 
## id val1 val2 
## 1: a 3 5 
## 2: b 2 6 
## 3: r 4 5 
+0

대신에 Reduce(rbind, ...) 또는 do.call(rbind, ...)을 사용할 수 있습니다! 감사합니다! 그러나 Spotfire와 R 통합을 사용하고 있으며 패키지 설치, OS, 버전, 소프트웨어 버전, 통계 서비스 간의 호환성 문제가 있으며 추가 라이브러리 나 루프가 필요없는 솔루션을 제공하는 것이 좋습니다. – agatha

+0

+1 가장 빠름 :-) – akrun

+0

젠장, 그 코드는 깨끗합니다. –

2

사용 numeric

df$val2 <- as.numeric(as.character(df$val2)) 
df[with(df, ave(val2, id, FUN=max)==val2),] 
# id val1 val2 
#3 a 3 5 
#5 b 2 6 
#6 r 4 5 

또는로 변환해야합니다 - unsplit

> unsplit(lapply(split(df, df$id), function(x) { 
     if(nrow(x) > 1) { 
      x[duplicated(x$id) & x$val2 == max(x$val2),] 
     } else { 
      x 
     } 
    }), levels(df$id)) 
# id val1 val2 
# 3 a 3 5 
# 5 b 2 6 
# 6 r 4 5 

또한이 대단한 unsplit

관련 문제