데이터 프레임에서 행을 어떻게 삭제합니까?
다음과 같은 "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
핵심 아이디어는 제거하려는 행 세트를 구성하고 해당 세트를 보완하는 것입니다.
R에서 세트의 보수는 '-'연산자로 제공됩니다.
그래서 가정하에 data.frame
이라고합니다 myData
:
myData[-c(2, 4, 6), ] # notice the -
물론 myData
행을 완전히 삭제 하려면 "재 할당" 하는 것을 잊지 마십시오. 그렇지 않으면 R은 결과를 인쇄합니다.
myData <- myData[-c(2, 4, 6), ]
소위 부울 벡터 (일명 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
가 지정됩니다 .NA
A
행 번호 별 삭제 문제
빠르고 더러운 분석을 위해 최상위 답변에 따라 숫자로 data.frame의 행을 삭제할 수 있습니다. 즉,
newdata <- myData[-c(2, 4, 6), ]
그러나 강력한 데이터 분석 스크립트를 작성하려는 경우 일반적으로 숫자 위치별로 행을 삭제하지 않아야합니다. 데이터의 행 순서는 나중에 변경 될 수 있기 때문입니다. data.frame 또는 데이터베이스 테이블의 일반적인 원칙은 행의 순서가 중요하지 않다는 것입니다. 순서가 중요하면 data.frame의 실제 변수로 인코딩해야합니다.
예를 들어, 데이터를 검사하고 삭제하려는 행의 행 번호를 식별 한 후 데이터 위치를 가져 와서 숫자 위치로 행을 삭제했다고 가정하십시오. 그러나 나중에 언젠가는 원시 데이터로 이동하여 데이터를 살펴보고 순서를 변경합니다. 행 삭제 코드는 이제 잘못된 행을 삭제하며, 더 나쁘게, 이것이 발생했음을 경고하는 오류가 발생하지 않을 것입니다.
더 나은 전략
보다 효과적인 전략은 행의 실질적이고 안정적인 속성을 기반으로 행을 삭제하는 것입니다. 예를 들어, id
각 사례를 고유하게 식별 하는 열 변수 가있는 경우이를 사용할 수 있습니다.
newdata <- myData[ !(myData$id %in% c(2,4,6)), ]
다른 경우에는 공식적인 제외 기준을 지정할 수 있으며 R의 여러 하위 설정 도구 중 하나를 사용하여 해당 규칙에 따라 사례를 제외 할 수 있습니다.
데이터 프레임에 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)
간단한 순서로 :
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) , ]
Delete Dan from employee.data - No need to manage a new data.frame.
employee.data <- subset(employee.data, name!="Dan")
Here's a quick and dirty function to remove a row by index.
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), ])
}
}
It's main flaw is it the row_index argument doesn't follow the R pattern of being a vector of values. There may be other problems as I only spent a couple of minutes writing and testing it, and have only started using R in the last few weeks. Any comments and improvements on this would be very welcome!
참고URL : https://stackoverflow.com/questions/12328056/how-do-i-delete-rows-in-a-data-frame
'IT story' 카테고리의 다른 글
자바 연관 배열 (0) | 2020.05.08 |
---|---|
grep으로 한 줄에 두 줄을 일치시킵니다. (0) | 2020.05.08 |
1030 저장소 엔진에서 28 오류가 발생했습니다 (0) | 2020.05.08 |
오류 ITMS-9000 :“중복 이진 업로드. (0) | 2020.05.08 |
SQL Server. (0) | 2020.05.08 |