我正在使用 dplyr 和資料包“storms”。
我需要一個表格,在其中我將每個測量的風暴放在一個列中。然后我想給每一行一個ID。
到目前為止我有
storm_ID <- storms %>%
select(year,month,name) %>%
group_by(year,month,name) %>%
summarise(ID = n())
storm_ID
View(storm_ID)
唯一的問題是它對我沒有任何作用。
我不太明白如何才能看到表格中的每一場風暴。我之前按名稱對它們進行了排序。然后我得到214個風暴。然而,同名風暴會在幾年后發生。
最后我想要類似的東西:
name | year | month | day | ID
| | | | |
Zeta 2005 12 31 Zeta1
Zeta 2006 1 1 Zeta1
| | | | |
Zeta 2020 10 24 Zeta2
為此,我需要知道是否在 2 年內(即從 2005-12-31 到 2006-01-01)發生了一場風暴,但這應該只算作一場風暴。
之后,我應該能夠評估每次風暴的持續時間、風速差和壓力差。我已經用錯誤的排序評估過的東西。
幫助會很好。
提前致謝。
uj5u.com熱心網友回復:
如果您將風暴算作一個,如果它們持續到第二天但沒有間隔,沒有同名風暴的日子,那么下面的代碼可能就是您想要的。
該變數Thresh設定為風暴被視為同一風暴的最大連續天數。
suppressPackageStartupMessages(library(dplyr))
data("storms", package = "dplyr")
Thresh <- 5
storms %>%
count(name, year, month, day) %>%
group_by(name) %>%
mutate(Date = as.Date(ISOdate(year, month, day)),
DDiff = c(0, diff(Date)) > Thresh,
DDiff = cumsum(DDiff)) %>%
group_by(name, DDiff) %>%
mutate(name = ifelse(DDiff > 0, paste(name, cur_group_id(), sep = "."), name)) %>%
ungroup() %>%
group_by(name) %>%
summarise(name = first(name),
year = first(year),
n = sum(n))
#> # A tibble: 512 x 3
#> name year n
#> <chr> <dbl> <int>
#> 1 AL011993 1993 8
#> 2 AL012000 2000 4
#> 3 AL021992 1992 5
#> 4 AL021994 1994 6
#> 5 AL021999 1999 4
#> 6 AL022000 2000 12
#> 7 AL022001 2001 5
#> 8 AL022003 2003 4
#> 9 AL022006 2006 5
#> 10 AL031987 1987 32
#> # ... with 502 more rows
由reprex 包于 2022-04-15 創建(v2.0.1)
編輯
看到 OP 的答案后,我修改了我的,現在它們幾乎相同。
主要區別在于,即使將有記錄天數的差距擴大Thresh到 5 天,暴風雨Dorian也有連續 5 天無記錄,從 2013 年 7 月 27 日到 2013 年 8 月 2 日。還是一樣的,它應該只被視為一場暴風雨。要獲得此結果,請增加到Thresh適當的值,例如 30(天)并且輸出現在匹配。
我已經這樣離開了,以說明這一點并說明變數Thresh的含義。
在下面的代碼中,我將上面代碼的結果分配給 data.framerui并且 OP 的結果被cbind'edid和管道傳輸到 count 指令。然后保存在storm_count. 從我的列中anti_join洗掉 id 后,比較這兩個輸出的差異。name
suppressPackageStartupMessages(library(dplyr))
data("storms", package = "dplyr")
Thresh <- 5
storms %>%
count(name, year, month, day) %>%
group_by(name) %>%
mutate(Date = as.Date(ISOdate(year, month, day)),
DDiff = c(0, diff(Date)) > Thresh,
DDiff = cumsum(DDiff)) %>%
group_by(name, DDiff) %>%
mutate(name = ifelse(DDiff > 0, paste(name, cur_group_id(), sep = "."), name)) %>%
ungroup() %>%
group_by(name) %>%
summarise(name = first(name),
year = first(year),
n = sum(n)) -> rui
id <- c()
j <- 1
k <- 1
for(i in storms$name) {
if(k-1 == 0){
id <- append(id, j)
k <- k 1
next
}
if(i != storms$name[k-1])
{
j <- j 1
}
id <- append(id, j)
k <- k 1
}
cbind(storms, id) %>%
count(name, id) -> storm_count
# two rows
anti_join(
rui %>% mutate(name = sub("\\.\\d $", "", name)),
storm_count,
by = c("name", "n")
)
#> # A tibble: 2 x 3
#> name year n
#> <chr> <dbl> <int>
#> 1 Dorian 2013 16
#> 2 Dorian 2013 4
# just one row
anti_join(
storm_count,
rui %>% mutate(name = sub("\\.\\d $", "", name)),
by = c("name", "n")
)
#> name id n
#> 1 Dorian 397 20
# see here the dates of 2013-07-27 and 2013-08-02
storms %>%
filter(name == "Dorian", year == 2013) %>%
count(name, year, month, day)
#> # A tibble: 7 x 5
#> name year month day n
#> <chr> <dbl> <dbl> <int> <int>
#> 1 Dorian 2013 7 23 1
#> 2 Dorian 2013 7 24 4
#> 3 Dorian 2013 7 25 4
#> 4 Dorian 2013 7 26 4
#> 5 Dorian 2013 7 27 3
#> 6 Dorian 2013 8 2 1
#> 7 Dorian 2013 8 3 3
由reprex 包于 2022-04-15 創建(v2.0.1)
uj5u.com熱心網友回復:
對于你的第一個問題:
storm_ID <- storms %>%
select(year,month,name) %>%
group_by(year,month,name) %>%
mutate(ID = stringr::str_c(name, cur_group_id()))
這會創建一個唯一的 Storm-Name-ID,例如 Amy1、Amy2 等。
這是您可以檢查風暴是否連續發生的方法
storms %>%
group_by(name) %>%
mutate(consec_helper = cumsum(c(1, diff(year) != 1))) %>%
group_by(name, consec_helper) %>%
filter(n() > 1)
我發現這僅適用于 Zeta
name year
<chr> <dbl>
1 Zeta 2005
2 Zeta 2006
uj5u.com熱心網友回復:
感謝您的方法,不幸的是,所有方法都不是合適的解決方案。
我向我的教授尋求幫助,他說我可以用回圈開始查詢。(我沒想到會有答案)所以我后來檢查了名字,看看它們是否改變了。資料集按日期排序,因此如果不是同一風暴,Zeta 不會連續出現。
我目前的解決方案是:
install.packages(dplyr)
library(dplyr)
id <- c()
j <- 1
k <- 1
for(i in storms$name) {
if(k-1 == 0){
id <- append(id, j)
k <- k 1
next
}
if(i != storms$name[k-1])
{
j <- j 1
}
id <- append(id, j)
k <- k 1
}
storms <- cbind(storms, id)
View(storms)
我現在手動檢查了資料集,并認為這是解決我的問題的合適方法。
這讓我想到了 511 場不同的風暴。(截至 22-04-15)
不過,感謝您提供的所有解決方案,我非常感謝。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/462157.html
