![](/img/trans.png)
[英]count occurrences in multiple columns (but for each row) based on value in another column
[英]R - row count across columns using specific starting column based on value in another column
被困在這個問題上一段時間了。
對於每一行,我試圖計算所有大於 0 的值的列。但需要注意的是,我需要指定起始列以開始使用另一列中每一行的特定值進行計數。
例如,該表如下所示:
ID | StartWeek | 1 | 2 | 3 |
123 2 3 0 1
456 1 1 0 1
預期的 output 將如下所示:
ID | StartWeek | 1 | 2 | 3 | CountRow |
123 2 3 0 1 1
456 1 1 0 1 2
我試過這樣的事情:
df <- df %>%
mutate(CountRow = rowSums(.[StartWeek:5] > 0))
但它只是給了我整列而不是每一行的單獨值。 我想我讀到了一個使用 groupby() 的潛在解決方案,但是否會通過另一種方式來做到這一點,即訪問每一行的某個值而不是調用整個列。
一種方法是將 dataframe 轉換為長格式,並在計數前根據StartWeek
過濾掉不必要的單元格。
library(tidyverse)
df <- tribble(
~ID, ~StartWeek, ~"1", ~"2", ~"3",
123L, 2L, 3L, 0L, 1L,
456L, 1L, 1L, 0L, 1L
)
df %>% pivot_longer(cols=-c(ID, StartWeek)) %>%
mutate(name=as.integer(name)) %>% filter(name>=StartWeek, value>0) %>%
group_by(ID) %>% summarize(CountRow=n(), .groups="drop") %>%
left_join(df, ., by="ID")
#> # A tibble: 2 x 6
#> ID StartWeek `1` `2` `3` CountRow
#> <int> <int> <int> <int> <int> <int>
#> 1 123 2 3 0 1 1
#> 2 456 1 1 0 1 2
由代表 package (v1.0.0) 於 2021 年 3 月 11 日創建
對於每一行,我們可以計算StartWeek
之后有多少值大於 0。在dplyr
,我們可以使用rowwise
:
library(dplyr)
df %>%
rowwise() %>%
mutate(CountRow = { tmp <- c_across(`1`:`3`);
sum(tmp[StartWeek:length(tmp)] > 0)
})
# ID StartWeek `1` `2` `3` CountRow
# <int> <int> <int> <int> <int> <int>
#1 123 2 3 0 1 1
#2 456 1 1 0 1 2
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.