![](/img/trans.png)
[英]R: Making subsetting of rows of a data.frame based on another data.frame independent
[英]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
角度值在0
為mast6_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列值設置為0
和mast6_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.