簡體   English   中英

如何將數據框過濾為 R 中不同列的最小值和最大值?

[英]How to filter a data frame to only min and max values of different columns in R?

假設我有以下數據框:

df <- data.frame(id = c(1,1,1,2,2,2,3,3,3,3),
                 col1 = c("a","a", "b", "c", "d", "e", "f", "g", "h", "g"),
                 start_day = c(NA,1,15, NA, 4, 22, 5, 11, 14, 18),
                 end_day = c(NA,2, 15, NA, 6, 22, 6, 12, 16, 21))

在此處輸入圖像描述

我想創建一個具有以下列的數據框: id, start_day, end_day ,這樣對於每個唯一的 id ,我只需要start_day列的最小值end_day列的最大值 最終的數據框應如下所示:

在此處輸入圖像描述

為了獲得這個新的數據框,我編寫了以下代碼:

df <- df[!(is.na(df$start_day)), ]

dt <- data.frame(matrix(ncol =3 , nrow = length(unique(df$id))))
colnames(dt) <- c("id", "start_day", "end_day")
dt$id <- unique(df$id)


st_day <- vector()
en_day <- vector()
for (elm in dt$id) {
  d <- df[df$id == elm, ]
  minimum <- min(d$start_day)
  maximum <- max(d$end_day)
  st_day <- c(st_day, minimum)
  en_day <- c(en_day, maximum)
}

dt$start_day <- st_day
dt$end_day <- en_day
df <- dt 

我的代碼正在創建我正在尋找的東西,但我對此並不滿意。 我很想學習一種更好、更清潔的方法來做同樣的事情。 任何想法都非常感謝。

這應該這樣做:

df %>% group_by(id) %>% summarise(start_day = min(start_day, na.rm = T),
                                  end_day = max(end_day, na.rm = T))

輸出:

     id start_day end_day
  <dbl>     <dbl>   <dbl>
1     1         1      15
2     2         4      22
3     3         5      21

您可以嘗試如下data.table

> library(data.table)

> na.omit(setDT(df))[, .(start_day = min(start_day), end_day = max(end_day)), id]
   id start_day end_day
1:  1         1      15
2:  2         4      22
3:  3         5      21

暫無
暫無

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

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