我試圖一次在三個不同的事情之后對一張桌子進行分組。我在最后一步有問題。我的資料集 (band_list) 的前十行如下所示:
BandName Year BandType
1 Agamemnon 2020 0
2 Ajax 2010 0
3 Ajax 2011 0
4 Ajax 2012 0
5 Ajax 2013 0
6 Ajax 2014 0
7 Ajax-Egerton 2016 1
8 Aldo 2016 0
9 Aldo 2017 0
10 Aldo-Knottboy 2018 1
首先,我想按名稱和波段型別對我的資料集進行分組。為此,我知道我可以使用以下代碼。
df <- band_list %>% group_by(`BandName(Stallion-Tag)`, BandType)
其次,我想按年份分組。意思是,我想將具有相同名稱和樂隊型別以及連續年份的樂隊分組為一組并計算出現的總數。例如,Ajax(第 2-6 行)以相同的名稱和型別出現五次,并且也在連續年份(2010-2014)內出現,所以我想得到 5 的結果。
occurence_band <- band_list %>% count(`BandName(Stallion-Tag)`, BandType)
我確實用我的代碼得到了這個,但我有一些資料,其中缺少一年,但名稱和型別保持不變。例如,
BandName Year BandType
40 Arno 2014 0
41 Arno 2015 0
42 Arno 2017 0
43 Arno 2018 0
44 Arno 2020 0
使用 R 上方的相同代碼會給我 Arno 的計數為 5,但我想在這里為 Arno 設定三個不同的組:Arno (2014-2015) 計數為 2,Arno (2017-2018) 也計數為 2 和 Arno ( 2020) 計數為 1。我需要像這樣分開它,因為這對于我必須做的進一步分析很重要。我認為撰寫自己的函式可能會解決我的問題,但我只撰寫了一次自己的函式,所以我現在有了如何告訴 R 查找連續年份并計算它的想法(我沒有找到任何有效的方法)。任何幫助將非常感激。
uj5u.com熱心網友回復:
Runs使用邏輯技巧創建一個變數cumsum并將此變數包含在分組變數中。然后計算子組。
df1 <- read.table(text = "
BandName Year BandType
40 Arno 2014 0
41 Arno 2015 0
42 Arno 2017 0
43 Arno 2018 0
44 Arno 2020 0
", header = TRUE)
suppressPackageStartupMessages(library(dplyr))
df1 %>%
mutate(Runs = cumsum(c(1L, diff(Year)) > 1L)) %>%
group_by(BandName, BandType, Runs) %>%
summarize(Count = n(), .groups = "drop") %>%
select(-Runs)
#> # A tibble: 3 x 3
#> BandName BandType Count
#> <chr> <int> <int>
#> 1 Arno 0 2
#> 2 Arno 0 2
#> 3 Arno 0 1
由reprex 包(v2.0.1)創建于 2022-03-13
這也適用于df2下面。
df2 <- read.table(text = "
BandName Year BandType
1 Agamemnon 2020 0
2 Ajax 2010 0
3 Ajax 2011 0
4 Ajax 2012 0
5 Ajax 2013 0
6 Ajax 2014 0
7 Ajax-Egerton 2016 1
8 Aldo 2016 0
9 Aldo 2017 0
10 Aldo-Knottboy 2018 1
", header = TRUE)
df2 %>%
mutate(Runs = cumsum(c(1L, diff(Year)) > 1L)) %>%
group_by(BandName, BandType, Runs) %>%
summarize(Count = n(), .groups = "drop") %>%
select(-Runs)
#> # A tibble: 5 x 3
#> BandName BandType Count
#> <chr> <int> <int>
#> 1 Agamemnon 0 1
#> 2 Ajax 0 5
#> 3 Ajax-Egerton 1 1
#> 4 Aldo 0 2
#> 5 Aldo-Knottboy 1 1
由reprex 包(v2.0.1)創建于 2022-03-13
uj5u.com熱心網友回復:
這里使用 data.table 包:
library(data.table)
dat <- as.data.table(test)
result <- dat[, .(count= .SD[, .N, cumsum(c(1L, diff(Year) > 1L))]$N), .(BandName, BandType)]
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/444672.html
上一篇:Ruby-素數唯一和重復
