我有以下的數據框與,,並NA S表示ID分別爲A到E的1年時間:計數序列橫行
dat <- data.frame(
id = c("A", "B", "C", "D", "E"),
jan = c(0, 0, NA, 1, 0),
feb = c(0, 1, 1, 0, 0),
mar = c(0, 0, 1, 0, 1),
apr = c(0, NA, 0, NA, 1),
may = c(0, NA, 0, 0, 0),
jun = c(0, 0, 0, 0, 0),
jul = c(0, 0, 0, 0, 1),
aug = c(NA, 0, 0, 1, 1),
sep = c(NA, 0, 0, 1, NA),
okt = c(NA, 0, 0, 0, NA),
nov = c(NA, 0, 0, 0, 1),
dez = c(NA, 0, 0, 0, 0)
)
> dat
id jan feb mar apr may jun jul aug sep okt nov dez
A 0 0 0 0 0 0 0 NA NA NA NA NA
B 0 1 0 NA NA 0 0 0 0 0 0 0
C NA 1 1 0 0 0 0 0 0 0 0 0
D 1 0 0 NA 0 0 0 1 1 0 0 0
E 0 0 1 1 0 0 1 1 NA NA 1 0
我想算要滿足以下條件需要1秒爲每個ID移到該一年內的數量,但:
- 一個1的第一次出現是始終計爲1
- 的NA應被視爲0
- 一個1的第二次出現時僅計數,如果它是由六個或更多個 0之前/ NAS
在我的例子,計數將是:
> dat
id jan feb mar apr may jun jul aug sep okt nov dez count
1 A 0 0 0 0 0 0 0 NA NA NA NA NA => 0
2 B 0 1 0 NA NA 0 0 0 0 0 0 0 => 1
3 C NA 1 1 0 0 0 0 0 0 0 0 0 => 1
4 D 1 0 0 NA 0 0 0 1 1 0 0 0 => 2
5 E 0 0 1 1 0 0 1 1 NA NA 1 0 => 1
該函數應該以apply(dat[, -1], 1, my_fun)
的形式逐行應用並返回一個包含count(即0, 1, 1, 2, 1
)。有沒有人有一個想法如何實現這一點?
你能連續3或4或更多的滿足條件?或者你已經修復的列數只有一個模式 – Sotos
不,總是有12列。所以最大計數是2(在1之後只能有一個6個0的序列)。 – piptoma
關於你的編輯:你可以很容易地使用下面的一些答案來解決你編輯的問題。其中一些已經在1之前有6個以上的零。在適當的地方用NA替換NA是最簡單的。例如,在我的回答中,'dat [is.na(dat)] < - 0'或者'y [is.na(y)] < - 0'。 – demirev