2016-10-21 2 views
0

R에서 for 루프의 일부 행을 제거하려고합니다. 조건문은 그 행 아래의 행과 비교하므로 대괄호 안에 필터링 할 수 없습니다.변수 이름을 사용하여 R에서 행을 제거하려고 시도했습니다.

상수가 지정되면 행을 제거 할 수 있다는 것을 알고 있습니다 : dataframe[-2, ]. 변수를 사용하여 동일한 작업을 수행하기 만하면됩니다. dataframe[-x, ]. 전체 루프는 다음과 같습니다.

for (j in 1:(nrow(referrals) - 1)) { 
    k <- j + 1 
    if (referrals[j, "Client ID"] == referrals[k, "Client ID"] & 
     referrals[j, "Provider SubCode"] == referrals[k, "Provider SubCode"]) { 
    referrals[-k, ] 
    } 
} 

불만없이 코드가 실행되지만 행이 제거되지 않습니다 (일부는 있어야 함). 물론, 상수로 테스트하면 잘 동작합니다 : referrals[-2, ].

+1

그냥 실행'추천은 [-k,] '실제로는 아무것도하지 않습니다. R의 어떤 것과 마찬가지로 객체를 변경하려면 해당 객체에 'referral <- referrals [-k,]'와 같이 지정해야합니다. – joran

+1

... 비록이 코드가 고정 된 조각으로도 예상했던대로 작동한다는 것은 분명하지 않습니다. – joran

+1

한 라운드에서 'k'줄을 제거하면 다음 라운드에서 'j'가 마지막 'k'가됩니다. 따라서 데이터 프레임은 for 루프 범위에서 지정한 수의 줄로 끝나지 않으므로 'subscript out of bounds'오류가 발생합니다. 그래서 @ anans가 말했듯이, 당신은 당신의 코드를 재구성하는 것을 고려할 것입니다. – Facottons

답변

0

사람들이 작업 할 수 있도록 reproducible example을 추가해야합니다. 귀하의 데이터 구조를 알 수 없으므로 이것이 귀하에게 효과가 있는지를 짐작할 수 있습니다. 나는 논평에서 지적한 이유로 루프를 사용하지 않을 것이다. 먼저 제거 할 행을 식별 한 다음 정상적인 방법으로 제거합니다. 고려 : 당신이 원하는 경우 중복 된 결과를 실행

duplicated.rows <- duplicated(referrals) 

다음 : 그러나

referrals.double <- referrals[duplicated.rows, ] 

당신에 의해 주어진 모든 정보를 이용하여

set.seed(4499) # this makes the example exactly reproducible 
d <- data.frame(Client.ID  = sample.int(4, 20, replace=T), 
       Provider.SubCode = sample.int(4, 20, replace=T)) 
d 
# Client.ID Provider.SubCode 
# 1   1    1 
# 2   1    4 
# 3   3    2 
# 4   4    4 
# 5   4    1 
# 6   2    2 
# 7   2    2 # redundant 
# 8   3    1 
# 9   4    4 
# 10   3    4 
# 11   1    3 
# 12   1    3 # redundant 
# 13   3    4 
# 14   1    2 
# 15   3    2 
# 16   4    4 
# 17   3    4 
# 18   2    2 
# 19   4    1 
# 20   3    3 
redundant.rows <- with(d, Client.ID[1:nrow(d)-1]==Client.ID[2:nrow(d)] & 
          Provider.SubCode[1:nrow(d)-1]==Provider.SubCode[2:nrow(d)]) 
d[-c(which(redundant.rows)+1),] 
# Client.ID Provider.SubCode 
# 1   1    1 
# 2   1    4 
# 3   3    2 
# 4   4    4 
# 5   4    1 
# 6   2    2 
# 8   3    1 # 7 is missing 
# 9   4    4 
# 10   3    4 
# 11   1    3 
# 13   3    4 # 12 is missing 
# 14   1    2 
# 15   3    2 
# 16   4    4 
# 17   3    4 
# 18   2    2 
# 19   4    1 
# 20   3    3 
0

, 나는 이것이 좋은 대안이 될 수 있으리라 생각합니다 중복되지 않은 결과를 실행하려면 다음을 실행하십시오.

referrals.not.double <- referrals[!duplicated.rows, ] 

단계로 단계를 이동하려는 경우 (아마 당신을 위해 흥미로운) :

duplicated.rows.Client.ID <- duplicated(referrals$"Client ID") 

duplicated.rows.Provider.SubCode <- duplicated(referrals$"Provider SubCode") 

referrals.not.double <- referrals[!duplicated.rows.Client.ID, ] 

referrals.not.double <- referrals.not.double[!duplicated.rows.Client.ID, ] 
+1

이것은 내가 쓴 것과 비슷합니다. 그러나 논의 된 두 변수가 데이터 집합의 유일한 변수라는 점은 명확하지 않으므로 OP를 위해 duplicated()가 작동한다는 것이 명확하지 않습니다. 재현 할 수있는 예제는 사물을 명확히하는 데 도움이됩니다. – gung

관련 문제