簡體   English   中英

R:基於同一數據幀中另一個因子的NROW為數據幀子集設置子集

[英]R: Subsetting subsets of a dataframe based on NROW of another factor in the same data.frame

我在兩個位置(參考mast6和sonic_f)的三個位置(u,v和w)有3個方向的風速讀數,以用於特定的風向 (例如0º,5º等)。

我想以成對的形式繪制數據,但是參考桅桿在最初的X秒鍾沒有記錄。 我需要將聲音文件修整為第一個時間戳,每個角度和每個uv或w方向的等效參考桅桿數據都會顯示出來。

例如,每個位置的開始時間如下:

> aggregate(data=df,StartTime~MeasurementLocation+Angle,min)
         Location Angle StartTime
1     mast6_u      00    17602
2     mast6_v      00    17602
3     mast6_w      00    18602
4   sonic_f_u      00        2
5   sonic_f_v      00        2
6   sonic_f_w      00        2
7     mast6_u      05    13001
8     mast6_v      05    13001
9     mast6_w      05    13002
10  sonic_f_u      05        2
11  sonic_f_v      05        2
12  sonic_f_w      05        2

因此,例如,開始時間為屬於角度00的所有數據必須18602. 編輯

期望的輸出將是每個角度的單獨文件,對於Angle == 00,sonic_f_u v或w的長度與對於相同角度的mast_u v或w的最短數據集的長度相同。 例如,對於角度00,mast6_u v和w必須都從18602開始,因此sonic_f_u v和w也應從18602開始。

很難擊敗data.table在這...

library(data.table)
setDT(df)[ , start_time_max := max( StartTime ), by = Angle][StartTime >= start_time_max, ][, start_time_max := NULL][]

#    Num Location Angle StartTime
# 1:   3  mast6_w     0     18602
# 2:   9  mast6_w     5     13002

基准

microbenchmark::microbenchmark(
  data.table = setDT(df)[ , start_time_max := max( StartTime ), by = Angle][StartTime >= start_time_max, ][, start_time_max := NULL][],
  tidyverse = { left_join(df,
                          df %>%
                            group_by(Angle) %>%
                            summarise(max(StartTime)),
                          by = "Angle"
  ) %>%
      filter(StartTime == `max(StartTime)`) %>%
      select(-`max(StartTime)`) %>%
      arrange(Angle, Location) %>%
      unique()

    }, times = 100
)

# Unit: microseconds
#       expr      min       lq     mean   median       uq       max neval
# data.table  937.233 1050.057 1195.317 1196.169 1289.260  1808.488   100
# tidyverse  4694.900 4991.645 5409.146 5172.855 5341.563 24359.309   100

我想我不完全理解您的用例,但這就是我的解釋方式:對於每個角度,您都希望找到最大開始時間並過濾桅桿和聲波處所有風向的數據框,使它們相同開始時間。

在tidyverse中,您可以通過找到每個角度的最大開始時間並將其連接到原始數據幀中來實現。 然后使用過濾器刪除不匹配的開始時間:

left_join(df,
          df %>%
            group_by(Angle) %>%
            summarise(max(StartTime)),
          by = "Angle"
) %>%
  filter(StartTime == `max(StartTime)`) %>%
  select(-`max(StartTime)`) %>%
  arrange(Angle, Location) %>%
  unique()

# # A tibble: 2 x 4
#   Location Angle StartTime
#   <chr>    <int>     <int>
# 1 mast6_w      0     18602
# 2 mast6_w      5     13002

對列使用sort arrange()進行排序以刪除重復的行,並使用unique()除去重復項(如果行列不相同,則可能需要更強大的功能。

假設我有:

> dat
     Num  Location Angle StartTime
1    1   mast6_u     0     17602
2    2   mast6_v     0     17602
3    3   mast6_w     0     18602
4    4 sonic_f_u     0         2
5    5 sonic_f_v     0         2
6    6 sonic_f_w     0         2
7    7   mast6_u     5     13001
8    8   mast6_v     5     13001
9    9   mast6_w     5     13002
10  10 sonic_f_u     5         2
11  11 sonic_f_v     5         2
12  12 sonic_f_w     5         2

所有的轉換0角度值在0mast6_w你可以這樣做:

for (angle in c(0,5))
{
   dat[which(dat$Angle==0),4] <- dat[which(dat$Location=="mast6_w" & dat$Angle==0),4]
}

mast6_w所有0角度的第4列值設置為0mast6_w的值。 然后,您最終得到:

> dat
   Num  Location Angle StartTime
1    1   mast6_u     0     18602
2    2   mast6_v     0     18602
3    3   mast6_w     0     18602
4    4 sonic_f_u     0     18602
5    5 sonic_f_v     0     18602
6    6 sonic_f_w     0     18602
7    7   mast6_u     5     13001
8    8   mast6_v     5     13001
9    9   mast6_w     5     13002
10  10 sonic_f_u     5         2
11  11 sonic_f_v     5         2
12  12 sonic_f_w     5         2

對於其他人,這里的結構是:

structure(list(Num = 1:12, Location = c("mast6_u", "mast6_v", 
"mast6_w", "sonic_f_u", "sonic_f_v", "sonic_f_w", "mast6_u", 
"mast6_v", "mast6_w", "sonic_f_u", "sonic_f_v", "sonic_f_w"), 
    Angle = c(0L, 0L, 0L, 0L, 0L, 0L, 5L, 5L, 5L, 5L, 5L, 5L), 
    StartTime = c(17602L, 17602L, 18602L, 2L, 2L, 2L, 13001L, 
    13001L, 13002L, 2L, 2L, 2L)), class = "data.frame", row.names = c(NA, 
-12L))

暫無
暫無

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

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