2014-04-08 2 views
0

나는 data.frame을 가지고 있으며 다소 복잡한 기준과 일치하는 행을 삭제하고자합니다. 나는 아래와 같이 반복적 인 일련의 줄을 사용하여 그렇게 할 수있다. 그러나 이러한 접근 방식은 일반적이지 않습니다.적용 행 적용

my.df <- read.table(text = ' 
    Var1 Var2 Var3 Var4 Var5 Var6 Var7 Var8 Var9 
    0 1 0 1 1 1 0 0 0 
    1 0 1 1 1 1 0 0 1 
    0 1 1 0 1 1 0 0 1 
    0 1 1 1 1 1 1 1 1 
    1 0 1 0 1 1 0 1 1 
    0 0 1 0 0 0 1 0 1 
    0 0 1 0 0 0 0 0 0 
    1 0 1 0 1 1 1 0 0 
    1 1 1 1 0 0 1 0 1 
    0 1 0 0 0 0 0 0 1 
    0 0 1 1 1 0 1 0 1 
    1 0 0 0 1 0 0 0 1 
    1 0 1 1 0 0 0 1 0 
    0 0 1 1 0 0 1 1 1 
    1 0 0 0 1 0 0 1 0 
    0 0 0 0 0 1 0 1 1 
    1 1 0 0 1 1 1 1 1 
    0 0 1 0 0 0 0 1 0 
    0 0 1 1 1 0 1 0 0 
    0 1 0 0 1 1 1 0 0 
', header = TRUE) 

desired.result <- read.table(text = ' 
    Var1 Var2 Var3 Var4 Var5 Var6 Var7 Var8 Var9 
    0 0 1 0 0 0 0 0 0 
    1 1 1 1 0 0 1 0 1 
    1 0 1 1 0 0 0 1 0 
    0 0 1 0 0 0 0 1 0 
', header = TRUE) 

# this works, but is not general 

my.df2 <- my.df 
my.df2 <- my.df2[!(my.df2[,1]==0 & (my.df2[,4]==1 | my.df2[,5]==1)),] 
my.df2 <- my.df2[!(my.df2[,2]==0 & (my.df2[,6]==1 | my.df2[,7]==1)),] 
my.df2 <- my.df2[!(my.df2[,3]==0 & (my.df2[,8]==1 | my.df2[,9]==1)),] 
my.df2 

row.names(my.df2) <- NULL 
all.equal(my.df2, desired.result) 
# [1] TRUE 

이 코드를 일반화하고 싶습니다. 정기적으로 sapplyapply을 결합하여 데이터를 조작합니다. 그러나, 나는 데이터를 삭제하는 기능을 결코 결합하지 않았으며, 어떻게해야 할지를 알 수 없다.

아래 코드는 삭제할 행을 나타내지 만 삭제하지는 않습니다. 아래 코드의 다양한 변형이 효과가 없습니다.

my.df3 <- as.matrix(my.df) 

sapply(seq_along(1:3), function(i) { 
     apply(my.df3, 1, function(j) { 
      !(j[i]==0 & (j[(i+1)*2]==1 | j[((i+1)*2+1)]==1)) 
     }) 
}) 

인터넷 검색에서 '적용 대상 행 삭제'를 찾을 수있는 해결책이 없습니다. 조언 해 주셔서 감사합니다. 나는베이스가 R 인 솔루션을 선호한다. 나는 sapply 진술의 간단한 수정이 필요하다고 생각합니다. 아마도 완전히 다른 접근 방식이 더 좋을 수도 있습니다.

답변

1

먼저 seq_along(1:3)이 중복됩니다.이 기능은 단순히 1:3을 반환합니다. 당신의 apply(..., 1, ...) 호출의 결과가 논리적 벡터 인 경우 둘째, 당신은 단순히 그것을 사용 부분 집합 수 있습니다

다음
my.df3[apply(my.df3, 1, ...,), ] 
+0

원하는 결과를 반환하는 기능 코드를 포함하십시오. 현재 문제에 대한 답변을 적용하는 방법을 보는 데 약간의 어려움이 있습니다. –

0

가 중첩 applymy.df3 내에서의 로버트 Krzyzanowski의 제안에 게시하기 전에 시도의 변화를 조합에 따라 기능 솔루션입니다 :

my.df3 <- as.matrix(my.df) 

my.test <- sapply(seq_along(1:3), function(i) { 
        apply(my.df3, 1, function(j) { 
         !(j[i]==0 & (j[(i+1)*2]==1 | j[((i+1)*2+1)]==1)) 
        }) 
}) 

my.df3[apply(my.test,1,function(i) {all(i)==TRUE}),] 

    Var1 Var2 Var3 Var4 Var5 Var6 Var7 Var8 Var9 
[1,] 0 0 1 0 0 0 0 0 0 
[2,] 1 1 1 1 0 0 1 0 1 
[3,] 1 0 1 1 0 0 0 1 0 
[4,] 0 0 1 0 0 0 0 1 0