2013-04-02 6 views
3

데이터 프레임에서 한 행을 삭제하고 그 결과로 나오는 열을 더하고 싶습니다. 해당 내용을 기반으로 삭제하려는 행은 알지만 행 번호는 삭제하지 않습니다. 아래에서는 세 가지 예를 제시합니다. 그 중 두 가지는 작동합니다. -을 사용하여 행을 h 제하면 첫 x 째 행이 h 제될 경우에만 작동합니다. 왜 그런가요?행 번호를 모른 채 특정 행 삭제하기

내 질문은 다음과 유사합니다. How to delete the first row of a dataframe in R? 그러나 행 번호에 따라 행이 삭제됩니다.

# This works. 

state = 'OH' 

my.data = read.table(text = " 
     county y1990 y2000 
     cc  NA 2 
     OH  NA 10 
     bb  NA 1 
", sep = "", header = TRUE, na.strings = "NA", stringsAsFactors = FALSE) 

my.colsums2 <- colSums(my.data[!(my.data$county == state), 2:ncol(my.data)], na.rm=TRUE) 
my.colsums2 

# y1990 y2000 
# 0  3 

# This works. 

my.data = read.table(text = " 
     county y1990 y2000 
     OH  NA 10 
     cc  NA 2 
     bb  NA 1 
", sep = "", header = TRUE, na.strings = "NA", stringsAsFactors = FALSE) 

my.colsums2 <- colSums(my.data[-(my.data$county == state), 2:ncol(my.data)], na.rm=TRUE) 
my.colsums2 

# y1990 y2000 
# 0  3 

# This does not work. 

my.data = read.table(text = " 
     county y1990 y2000 
     cc  NA 2 
     OH  NA 10 
     bb  NA 1 
", sep = "", header = TRUE, na.strings = "NA", stringsAsFactors = FALSE) 

my.colsums2 <- colSums(my.data[-(my.data$county == state), 2:ncol(my.data)], na.rm=TRUE) 
my.colsums2 

# y1990 y2000 
# 0 11 

나는 여전히 !-의 차이 이상의 혼란 스러워요 것 같아요. 조언 해 주셔서 감사합니다.

+0

저는 이것이 여러분이 찾고있는 것이라고 생각합니다 :'colSums (my.data [my.data $ county! = "OH", -1], na.rm = TRUE)' – Arun

+1

실제로 마지막 두 예제는 잘못되었지만, 중간 예제는 행운이 있습니다. 부울 변수의 부정은'!'가 아닌'!'로 얻습니다. –

답변

6

-!의 차이를 정리해야하고, 당신이 거기에서 걸릴 수 있습니다 의심, 부울 값을 부정)

my.data$county == state 
# [1] TRUE FALSE FALSE 

!(my.data$county == state) 
# [1] FALSE TRUE TRUE 

-(my.data$county == state) 
# [1] -1 0 0 

!는 여기에 사용되어야하는 연산자입니다.

+1

즉, 부울에 적용된 '-'는 먼저 정수 (0과 1)로 변환 한 다음 부호를 변경합니다. – joran

+0

세 번째 데이터 세트에서 세 번째 행은 다음과 같습니다. [1] 0 -1 0 왜 -1 0 0이 원하는 결과를 허용하지만 0 -1 0이 아닌지 아직 확실하지 않습니다. 나는 그것에 대해 더 생각할 것이다. 답변 감사합니다. –

+0

예, 고맙습니다. '-X'는 문자 그대로 ** -1 * X로 취급되며, 평가 중에'논리 값'은'X + 0 '을 할 때와 마찬가지로'numeric'으로 변환됩니다. 흥미로운 측면 노트로서'+ c (TRUE, FALSE)'와'-c (TRUE, FALSE)'의 결과를 비교해보십시오. –

3

내가하는 일을 기억하는 것이 중요하다고 생각합니다. 조건부 인수를 행 또는 열을 부분 집합으로 전달할 때는 전체 길이가 TRUE 또는 FALSE이거나 행 (또는 열)을 나타내는 숫자 여야합니다.

다음은 벡터가있는 간단한 예입니다.

x <- rnorm(20) 

## These use integer values for indexing 
x[which(x > 1)] # Numbers > Only those numbers which match 

## These use logical values for indexing 
x[x > 1] # Logical > Only those that are true 
x[!(x < 1)] # Logical > Only those that are false 

나쁜 행동 :

x[-which(x > 1)] # Positive numbers to negative numbers = BAD 
x[!which(x > 1)] # Converts numbers to logical = BAD 
x[-(x > 1)] # Converts logical to numeric = BAD 

특정 귀하의 예제에 : 그들은

이 시도 제공을 확인하려면 콘솔에 조건을 입력 해보십시오

!(my.data$county == state) # Converts TRUE/FALSE to FALSE/TRUE 
which(my.data$county != state) # Rows where my.data$count not equal state 

을 개인적으로, 모든 경우에 which()을 사용하여 로직의 부정 가능성을 피하는 것이 좋습니다. 알 또는 숫자의 변환. 또한 "번역"하기가 더 쉽습니다.

+0

해답을 가져 주셔서 감사합니다. 원래의 예제로 원하는 결과를 얻으려면 권장되는 명령문을 추가하는 것이 좋습니다. 곧 게시 할 수 있지만 최적이 아닐 수도 있습니다. –

+0

이것이 바로 우리가 이러한 해답을 얻으려고하는 이유입니다. 하나는 숫자 (행)의 벡터를 만들고 다른 하나는 논리 벡터를 생성합니다. 올바른 것은 상황에 달려 있습니다. 두 가지 유형의 변수를 혼합하기 때문에'! (cond) '라고 말할 수 없습니다. 당신이'- (x> 1)' –

+0

+1을 말하면 안되는 것처럼이 답변을 정말 좋아합니다. (또한 내가 원하지 않으면 편집 한 내용을 되돌릴 수 있습니다.) –

관련 문제