簡體   English   中英

如何刪除數據框中的行?

[英]How do I delete rows in a data frame?

我有一個名為“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

其中A列被分配為NA (不是數字),其中A超過 4。

按行號刪除的問題

對於快速和臟分析,您可以根據最佳答案按編號刪除 data.frame 的行。 IE,

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) , ]

從employee.data 中刪除Dan - 無需管理新的data.frame。

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

為了完整dplyr ,我將補充說,這也可以使用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()) 有關更多示例,請參閱文檔

這是一個快速而骯臟的函數,用於按索引刪除一行。

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。 非常歡迎對此提出任何意見和改進!

通過名稱識別:

  1. 調出唯一 ID 並識別數據框 (DF) 中的位置。
  2. 標記為刪除。 如果唯一 ID 適用於多行,則所有這些行都將被刪除。

代碼:

Rows<-which(grepl("unique ID", DF$Column))
DF2<-DF[-c(Rows),]
DF2

使用唯一 ID 時的另一種方法是對數據進行子集化:*這來自我想刪除化學標准的實際報告

Chem.Report<-subset(Chem.Report, Chem_ID!="Standard")

Chem_ID 是列名。 這 ! 對排除很重要

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM