簡體   English   中英

R - 使用基於另一列中的值的特定起始列跨列的行數

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM