데이터 프레임에서 행을 어떻게 삭제합니까?


224

다음과 같은 "mydata"라는 데이터 프레임이 있습니다.

   A  B  C   D 
1. 5  4  4   4 
2. 5  4  4   4 
3. 5  4  4   4 
4. 5  4  4   4 
5. 5  4  4   4 
6. 5  4  4   4 
7. 5  4  4   4 

2,4,6 행을 삭제하고 싶습니다. 예를 들면 다음과 같습니다.

   A  B  C   D
1. 5  4  4  4 
3. 5  4  4  4 
5. 5  4  4  4 
7. 5  4  4  4 

12
또한 데이터 작업에 대한 몇 가지 일반적인 용어에 익숙해지는 것이 좋습니다. 이를 일반적으로 하위 설정이라고하며, Google에서 "r 서브 세트 데이터 프레임"을 검색하면 매우 유용한 UCLA R FAQ 페이지를 볼 수 있습니다. 그건 그렇고 Stackoverflow에 오신 것을 환영합니다!
A5C1D2H2I1M1N2O1R2T1 1

@mrdwab의 탁월한 답변 외에도 부울 벡터를 사용하여 하위 설정을 추가하는 몇 가지 방법이 추가되었습니다.
Paul Hiemstra

2
@ A5C1D2H2I1M1N2O1R2T1 : R 하위 설정에 대한 UCLA FAQ가 이동했습니다. 이제 여기 있습니다 .
마이크 Sherrill '고양이 리콜'

답변:


340

핵심 아이디어는 제거하려는 행 세트를 구성하고 해당 세트를 보완하는 것입니다.

R에서 세트의 보수는 '-'연산자로 제공됩니다.

그래서 가정하에 data.frame이라고합니다 myData:

myData[-c(2, 4, 6), ]   # notice the -

물론 myData행을 완전히 삭제 하려면 "재 할당" 하는 것을 잊지 마십시오. 그렇지 않으면 R은 결과를 인쇄합니다.

myData <- myData[-c(2, 4, 6), ]

59
안에있는 것을 잊지 마십시오 ,! ;)
Steven Jeuris

5
데이터 프레임이 하나의 열인 경우 어떻게됩니까? 전체 구조를
버리고

6
@road_to_quantdom drop = FALSE에 거기에 추가하십시오 .
A5C1D2H2I1M1N2O1R2T1 1

4
"R에서 세트의 보수는 '-'연산자로 제공됩니다."-> 이것은 매우 잘못된 단어입니다. 음수 색인이 제거되고 그로 인해 보완 개념이 없습니다. 논리에 -대한 보수 연산자가이므로 논리로 작업하고 사용하려고 시도하면 작동 하지 않습니다 !. 행에서 c (2,4,6)의 보수는 오히려 setdiff (c (2,4,6), 1 : nrow (myData))이며, c (-2, -4, -6)가 아닙니다. 와 함께 사용하면 둘 다 동일한 행을 생성하지만 [.
asac

2
@Speldosa, myData[-c(2, 4, 6),,drop=F]. 사실, 나는 항상 매트릭스 액세스 ,drop=F직전에 삽입하는 것이 좋습니다 ].
Aaron McDaid

82

소위 부울 벡터 (일명 logical:

row_to_keep = c(TRUE, FALSE, TRUE, FALSE, TRUE, FALSE, TRUE)
myData = myData[row_to_keep,]

참고는 것을 !연산자는 NOT, 즉 역할 !TRUE == FALSE:

myData = myData[!row_to_keep,]

@mrwab의 답변 (+ 1 btw :)과 비교하면 약간 성가신 것처럼 보이지만 열 값이 특정 값을 초과하는 경우 논리 벡터를 즉석에서 생성 할 수 있습니다.

myData = myData[myData$A > 4,]
myData = myData[!myData$A > 4,] # equal to myData[myData$A <= 4,]

부울 벡터를 인덱스 벡터로 변환 할 수 있습니다.

row_to_keep = which(myData$A > 4)

마지막으로 매우 깔끔한 트릭은 추출뿐만 아니라 할당에도 이러한 종류의 하위 설정을 사용할 수 있다는 것입니다.

myData$A[myData$A > 4,] <- NA

여기서 열 이 4를 초과 하는 경우 ( 숫자가 아님) A가 지정됩니다 .NAA


제외하려면 어떻게해야합니까? 당신의 예 번호 3에서, 만약 당신이
가고

61

행 번호 별 삭제 문제

빠르고 더러운 분석을 위해 상위 답변에 따라 숫자로 data.frame의 행을 삭제할 수 있습니다. 즉,

newdata <- myData[-c(2, 4, 6), ] 

그러나 강력한 데이터 분석 스크립트를 작성하려는 경우 일반적으로 숫자 위치별로 행을 삭제하지 않아야합니다. 데이터의 행 순서는 나중에 변경 될 수 있기 때문입니다. data.frame 또는 데이터베이스 테이블의 일반적인 원칙은 행의 순서가 중요하지 않다는 것입니다. 순서가 중요하면 이는 data.frame의 실제 변수로 인코딩되어야합니다.

예를 들어, 데이터를 검사하고 삭제하려는 행의 행 번호를 식별 한 후 데이터 위치를 가져 와서 숫자 위치로 행을 삭제했다고 가정하십시오. 그러나 나중에는 원시 데이터로 이동하여 데이터를 살펴보고 순서를 다시 정합니다. 행 삭제 코드는 이제 잘못된 행을 삭제하며, 더 나쁘게, 이것이 발생했음을 경고하는 오류가 발생하지 않을 것입니다.

더 나은 전략

보다 효과적인 전략은 행의 실질적이고 안정적인 속성을 기반으로 행을 삭제하는 것입니다. 예를 들어, id각 사례를 고유하게 식별 하는 열 변수 가있는 경우이를 사용할 수 있습니다.

newdata <- myData[ !(myData$id %in% c(2,4,6)), ]

다른 경우에는 공식적인 제외 기준을 지정할 수 있으며 R의 많은 하위 설정 도구 중 하나를 사용하여 해당 규칙에 따라 사례를 제외 할 수 있습니다.


11

데이터 프레임에 id 열을 만들거나 열 이름을 사용하여 행을 식별하십시오. 인덱스를 사용하는 것은 공평하지 않습니다.

사용하여 subset새 프레임을 생성하는 기능.

updated_myData <- subset(myData, id!= 6)
print (updated_myData)

updated_myData <- subset(myData, id %in% c(1, 3, 5, 7))
print (updated_myData)

9

간단한 순서로 :

mydata[-(1:3 * 2), ]

순서대로 :

mydata[seq(1, nrow(mydata), by = 2) , ]

부정적인 순서로 :

mydata[-seq(2, nrow(mydata), by = 2) , ]

또는 홀수를 선택하여 부분 집합을 설정하려는 경우 :

mydata[which(1:nrow(mydata) %% 2 == 1) , ]

또는 홀수를 선택하여 부분 집합을 원하는 경우, 버전 2 :

mydata[which(1:nrow(mydata) %% 2 != 0) , ]

또는 짝수를 필터링하여 부분 집합을 원한다면 :

mydata[!which(1:nrow(mydata) %% 2 == 0) , ]

또는 짝수를 필터링하여 부분 집합을 설정하려면 버전 2를 사용하십시오.

mydata[!which(1:nrow(mydata) %% 2 != 1) , ]

5

employee.data에서 Dan 삭제-새 data.frame을 관리 할 필요가 없습니다.

employee.data <- subset(employee.data, name!="Dan")

0

인덱스별로 행을 제거하는 빠르고 더러운 기능이 있습니다.

removeRowByIndex <- function(x, row_index) {
  nr <- nrow(x)
  if (nr < row_index) {
    print('row_index exceeds number of rows')
  } else if (row_index == 1)
  {
    return(x[2:nr, ])
  } else if (row_index == nr) {
    return(x[1:(nr - 1), ])
  } else {
    return (x[c(1:(row_index - 1), (row_index + 1):nr), ])
  }
}

주요 결함은 row_index 인수가 값 벡터의 R 패턴을 따르지 않는다는 것입니다. 몇 분 동안 쓰고 테스트하면서 다른 문제가있을 수 있으며 지난 몇 주 동안 R을 사용하기 시작했습니다. 이것에 대한 의견과 개선은 매우 환영받을 것입니다!


0

완벽을 기하기 위해 이것을 dplyr사용하여 수행 할 수 있다고 덧붙입니다 slice. 이것을 사용하면 파이프 워크 플로의 일부가 될 수 있다는 장점이 있습니다.

df <- df %>%
  .
  .
  slice(-c(2, 4, 6)) %>%
  .
  .

물론 파이프 없이도 사용할 수 있습니다.

df <- slice(df, -c(2, 4, 6))

"벡터가 아닌"형식 -c(2, 4, 6)은 2, 4 및 6 행에 없는 모든 것을 얻는 것을 의미합니다 . 범위를 사용하는 예를 들어, 처음 5 개의 행을 제거하고 싶다고 가정 해 봅시다 slice(df, 6:n()). 더 많은 예제는 docs를 참조하십시오 .

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.