2013-10-03 2 views
0

데이터 프레임의 특정 행을 제거해야하지만 문제가 있습니다. 데이터 집합은 다음과 같습니다 : 나는 적어도 하나의 양이 NA 또는 음수 인 coupleid의 모든 레코드를 삭제하면됩니다 싶습니다 무엇데이터 프레임의 레코드를 제거하는 방법

> head(mergedmalefemale) 
    coupleid gender shop time amount 
1  1  W 3 1 29.05 
2  1  W 1 2 31.65 
3  1  W 3 3  NA 
4  1  W 2 4 17.75 
5  1  W 3 5 -28.40 
6  2  W 1 1 42.30 

. 위의 예제에서, coupleid가 "1"인 모든 행은 음수 값과 NA가있는 행이 삭제되어야합니다. na.omit(mergedmalefemale) 등의 함수를 사용해 보았습니다. 그러나 이것은 동일한 cupleid를 가진 다른 행은 아니지만 NA가있는 행만 삭제합니다. 나는 초보자로서 누군가가 나를 도울 수 있다면 행복 할 것이다.

+0

을 적용하고 샘플 데이터를 생성하기 위해 붙여 넣기 또 다른 좋은 기회입니다. 우리의 삶을 편하게 해줍니다. – Spacedman

답변

2

df라고하면 제거한 다음 제거하려고합니다.

mergedmalefemale <- read.table(text=" 
    coupleid gender shop time amount 
    1  1  W 3 1 29.05 
    2  1  W 1 2 31.65 
    3  1  W 3 3  NA 
    4  1  W 2 4 17.75 
    5  1  W 3 5 -28.40 
    6  2  W 1 1 42.30", 
    header=TRUE) 

# Find NA and negative amounts 
del <- is.na(mergedmalefemale[,"amount"]) | mergedmalefemale[,"amount"]<0 
# Find coupleid with NA or negative amounts 
ids <- unique(mergedmalefemale[del,"coupleid"]) 
# Remove data with coupleid such that amount is NA or negative 
mergedmalefemale[!mergedmalefemale[,"coupleid"] %in% ids,] 
+1

초보자를 위해 여러 부분 집합이 약간 혼란스럽고 (나에게 도움이되었다고 가정 할 때) 마지막 줄 대신 subset()을 사용할 수 있습니다 : 'subset (mergedmalefemale,! coupleid % in % ids)' – Marianne

1

하나의 대안이 있습니다. 고려하여 data.frame은 만, 먼저 아이디의를 찾을 수있다 NA 또는 음을하지만, 같은 ID로 모든 데이터를 생략 할 금액을 생략하고 싶지 않기 때문에

> na.omit(df[ rowSums(df[, sapply(df, is.numeric)]< 0, na.rm=TRUE) ==0, ]) 
    coupleid gender shop time amount 
1  1  W 3 1 29.05 
2  1  W 1 2 31.65 
4  1  W 2 4 17.75 
6  2  W 1 1 42.30 
0

여기에 상당히 더러운 방법

# identify the coupleids that need to stay/be removed 
agg <- aggregate(amount ~ coupleid, data=mergedmalefemale, FUN=function(x) min(is.na(x)|(x>0))) 

# insert a column alongside "amount.y" that puts a 0 next to rows to be deleted 
df.1 <- merge(mergedmalefemale, agg, by="coupleid") 

# delete the rows 
df.1 <- df.1[df.1$amount.y == 1, ] 
1

우리가 잘라 수있는 코드를 제공 향후 data.table

require(data.table) 
mergedmalefemale <- as.data.table(mergedmalefemale) 
mergedmalefemale[, if(!any(is.na(amount) | amount < 0)) .SD, by=coupleid] 

# coupleid gender shop time amount 
#1:  2  W 1 1 42.3 
관련 문제