2016-09-02 1 views
2

R 데이터 프레임에서 중복 행을 제거하려고하지만 더 작거나 큰 값을 가진 행이 필요합니다. 이 질문의 목적에 귀찮음) 특정 열에 보관해야합니다.R의 데이터 프레임에서 중복 행을 제거하고 더 작거나 큰 값을 유지합니다.

이 같은 (양쪽에서) 일반적으로 중복 행을 제거 할 수 있습니다

df = data.frame(x = c(1,1,2,3,4,5,5,6,1,2,3,3,4,5,6), 
      y = c(rnorm(4),NA,rnorm(10)), 
      id = c(rep(1,8), rep(2,7))) 

splitID <- split(df , df$id) 
lapply(splitID, function(x) x[!duplicated(x$x),]) 

어떻게 중복 행의 제거를 조정 할 수 있습니까?

감사합니다.

답변

2

사용 ave()으로 큰 값, order을 유지, 즉 duplicated

lapply(splitID, function(x) x[!duplicated(x[order(x$x, x$y),]$x),]) 

을 적용하기 전에 그 반대에 대한 order해야 할 수도 있습니다. 프레임

idx = as.logical(ave(df$y, df$x, df$id, FUN=fun)) 
df[idx,, drop=FALSE] 

일부 가능한 fun은`설정 = TRUE ', 나는 제거 두 번째 중복 된 후 행을 얻을 감소 할 때의 dplyr 버전은

df %>% group_by(x, id) %>% filter(fun2(y)) 
1

우리는 데이터를 하위 집합 논리적 인덱스를 반환하는 decreasing = TRUE

+0

수 있습니다

fun1 = function(x) !is.na(x) & !duplicated(x) & (x == min(x, na.rm=TRUE)) fun2 = function(x) { res = logical(length(x)) res[which.min(x)] = TRUE res } 

있습니다. – user3237820

+0

@ user3237820'lapply (splitID, function (x) x [! 중복 된 (x [x $ x, x $ y], $ x, fromLast = TRUE),])' – akrun

+0

아니요, 가장 작은 값이 아닌 아래쪽에서부터 위쪽으로 첫 번째 복제본. – user3237820

관련 문제