데이터 프레임에서 행을 삭제하려면 어떻게 해야 합니까?
"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
where 열A
할당됨NA
(숫자가 아닌) 어디에A
4를 초과합니다.
행 번호별 삭제 문제
신속하고 더러운 분석을 위해 상위 답변에 따라 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) , ]
완전성을 위해, 이것은 다음과 같이 할 수 있습니다.dplyr
을 사용하는 것과 동시에slice
이 기능을 사용하면 파이프 워크플로우의 일부가 될 수 있다는 장점이 있습니다.
df <- df %>%
.
.
slice(-c(2, 4, 6)) %>%
.
.
물론 파이프 없이도 사용할 수 있습니다.
df <- slice(df, -c(2, 4, 6))
vector", 벡가아형식닌터,,-c(2, 4, 6)
2, 4, 6행에 없는 모든 것을 얻는 것을 의미합니다.범위를 사용하는 예를 들어, 처음 5개 행을 제거하려고 했다고 가정해 보겠습니다.slice(df, 6:n())
자세한 예는 문서를 참조하십시오.
employee.data에서 Dan 삭제 - 새 data.frame을 관리할 필요가 없습니다.
employee.data <- subset(employee.data, name!="Dan")
인덱스별 행을 제거하는 빠르고 더러운 기능이 있습니다.
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을 사용하기 시작했기 때문에 다른 문제가 있을 수 있습니다.이에 대한 의견과 개선 사항은 매우 환영할 것입니다!
이름으로 식별하기
- 고유 ID를 호출하고 데이터 프레임(DF)에서 위치를 식별합니다.
- 삭제할 표시.고유 ID가 여러 행에 적용되는 경우 이러한 모든 행이 제거됩니다.
코드:
Rows<-which(grepl("unique ID", DF$Column))
DF2<-DF[-c(Rows),]
DF2
고유 ID로 작업할 때의 또 다른 접근 방식은 데이터의 부분 집합을 만드는 것입니다. *이것은 화학 표준을 제거하고자 했던 실제 보고서에서 나온 것입니다.
Chem.Report<-subset(Chem.Report, Chem_ID!="Standard")
Chem_ID는 열 이름입니다.!는 제외하는 데 중요합니다.
언급URL : https://stackoverflow.com/questions/12328056/how-do-i-delete-rows-in-a-data-frame
'programing' 카테고리의 다른 글
C 및 C++의 정적 및 외부 글로벌 변수 (0) | 2023.06.12 |
---|---|
이 약속이 발신자에게 다시 해결되지 않는 이유는 무엇입니까? (0) | 2023.06.12 |
'내용'과 '텍스트'의 차이점은 무엇입니까? (0) | 2023.06.12 |
@nestjs/passport를 사용한 Nest.js의 선택적 인증 (0) | 2023.06.12 |
잘못된 메서드 이름에 대한 VBA 컴파일러 메시지 누락 (0) | 2023.06.12 |