나는 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
이 코드를 일반화하고 싶습니다. 정기적으로 sapply
과 apply
을 결합하여 데이터를 조작합니다. 그러나, 나는 데이터를 삭제하는 기능을 결코 결합하지 않았으며, 어떻게해야 할지를 알 수 없다.
아래 코드는 삭제할 행을 나타내지 만 삭제하지는 않습니다. 아래 코드의 다양한 변형이 효과가 없습니다.
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
진술의 간단한 수정이 필요하다고 생각합니다. 아마도 완전히 다른 접근 방식이 더 좋을 수도 있습니다.
원하는 결과를 반환하는 기능 코드를 포함하십시오. 현재 문제에 대한 답변을 적용하는 방법을 보는 데 약간의 어려움이 있습니다. –