2013-04-02 78 views
3

我想從數據框中刪除一行並對結果列進行求和。我知道我想根據其內容刪除的行,但不知道它的行號。下面我介紹三個例子,其中兩個是可行的。使用-刪除行只有在第一行被刪除時纔有效。這是爲什麼?在不知道行號的情況下刪除特定行

我的問題與此類似: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 $縣!=「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

是的,謝謝@joran。 '-X'被**當作** -1來處理,在評估過程中,邏輯值被轉換爲數字(就像做'X + 0'時一樣)。作爲一個有趣的方面說明,比較'+ 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

這就是我們試圖解決這些問題的原因。一個創建一個數字向量(行),另一個產生一個邏輯向量。正確的取決於情況。你不能說'!which(cond)',因爲你混合了兩種不同類型的變量。就像你不應該說' - (x> 1)' –

+0

+1我真的很喜歡這個答案。 (另外,請隨時回滾我剛纔所做的編輯,如果你不想要的話)。 –

相關問題