[英]R Summing over Columns and Rows for a Paired Analysis
一個有一個電子表格,用戶在其中輸入前后列中的年數。 一個例子如下所示。
有人想將 Yr_1、Yr_2、... Yr_n 行中提供的相應年份的數量相加,這些行對應於每個站點之前和之后的年份。
df = data.frame(
SITE = c(1,2,3),
Before=c(2,2,1),
After=c(2,5,6),
Yr_1=c(4,2,1),
Yr_2=c(4,0,0),
Yr_3=c(1,0,2),
Yr_4=c(5,2,1),
Yr_5=c(2,2,0),
Yr_6=c(1,0,1),
Yr_7=c(1,2,1))
df %>% mutate(
Total_Counts_Before=
ifelse(
Before == 1, rowSums(across(Yr_1)),
ifelse(
Before == 2, rowSums(across(Yr_1:Yr_2)),
ifelse(
Before == 3, rowSums(across(Yr_1:Yr_3)),
ifelse(
Before == 4, rowSums(across(Yr_1:Yr_4)),
ifelse(
Before == 5, rowSums(across(Yr_1:Yr_5)),
ifelse(
Before == 6, rowSums(across(Yr_1:Yr_6)),
ifelse(
Before == 7, rowSums(across(Yr_1:Yr_7)),"")))))))
)
但是,可能有多個組合(即 Before_Yr_n x After_Yr_n),因此需要在用戶表中為 After Year Counts 創建一組單獨的 7 列。
df = data.frame(
SITE = c(1,2,3),
Before=c(2,2,1),
After=c(2,5,6),
Before_Yr_1=c(4,2,1),
Before_Yr_2=c(4,0,0),
Before_Yr_3=c(0,0,0),
Before_Yr_4=c(0,0,0),
Before_Yr_5=c(0,0,0),
Before_Yr_6=c(0,0,0),
Before_Yr_7=c(0,0,0),
After_Yr_1=c(1,0,0),
After_Yr_2=c(5,2,2),
After_Yr_3=c(2,2,1),
After_Yr_4=c(1,0,0),
After_Yr_5=c(1,2,1),
After_Yr_6=c(0,0,1),
After_Yr_7=c(0,0,0)
)
df = df %>% mutate(
Total_Counts_Before=
ifelse(
Before == 1, rowSums(across(Before_Yr_1)),
ifelse(
Before == 2, rowSums(across(Before_Yr_1:Before_Yr_2)),
ifelse(
Before == 3, rowSums(across(Before_Yr_1:Before_Yr_3)),
ifelse(
Before == 4, rowSums(across(Before_Yr_1:Before_Yr_4)),
ifelse(
Before == 5, rowSums(across(Before_Yr_1:Before_Yr_5)),
ifelse(
Before == 6, rowSums(across(Before_Yr_1:Before_Yr_6)),
ifelse(
Before == 7, rowSums(across(Before_Yr_1:Before_Yr_7)),""))))))),
Total_Counts_After=
ifelse(
After == 1, rowSums(across(After_Yr_1)),
ifelse(
After == 2, rowSums(across(After_Yr_1:After_Yr_2)),
ifelse(
After == 3, rowSums(across(After_Yr_1:After_Yr_3)),
ifelse(
After == 4, rowSums(across(After_Yr_1:After_Yr_4)),
ifelse(
After == 5, rowSums(across(After_Yr_1:After_Yr_5)),
ifelse(
After == 6, rowSums(across(After_Yr_1:After_Yr_6)),
ifelse(
After == 7, rowSums(across(After_Yr_1:After_Yr_7)),"")))))))
)
有沒有一種方法可以避免將用戶輸入數據分別輸入 14 列或 3x14 矩陣?
所需的 output 可能看起來類似於,但必須包含 Total Before 和 After Count 列,如下所示:
df %>% kable()
地點 | 前 | 后 | Before_Yr_1 | Before_Yr_2 | Before_Yr_3 | Before_Yr_4 | Before_Yr_5 | Before_Yr_6 | Before_Yr_7 | After_Yr_1 | After_Yr_2 | After_Yr_3 | After_Yr_4 | After_Yr_5 | After_Yr_6 | After_Yr_7 | Total_Counts_Before | Total_Counts_After |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
1 | 2 | 2 | 4 | 4 | 0 | 0 | 0 | 0 | 0 | 1 | 5 | 2 | 1 | 1 | 0 | 0 | 8 | 6 |
2 | 2 | 5 | 2 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 2 | 2 | 0 | 2 | 0 | 0 | 2 | 6 |
3 | 1 | 6 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 2 | 1 | 0 | 1 | 1 | 0 | 1 | 5 |
我建議您將數據更改為長格式,然后過濾您感興趣的結果,我不知道您的之后或之前的概念是否包括當前年份但您可以輕松更改它
library(tidyverse)
df = data.frame(
SITE = c(1,2,3),
Before=c(2,2,1),
After=c(2,5,6),
Yr_1=c(4,2,1),
Yr_2=c(4,0,0),
Yr_3=c(1,0,2),
Yr_4=c(5,2,1),
Yr_5=c(2,2,0),
Yr_6=c(1,0,1),
Yr_7=c(1,2,1))
df |>
select(-Before,-After) |>
pivot_longer(-SITE,names_prefix = 'Yr_',names_to = 'year') |>
group_by(SITE) |>
mutate(before = cumsum(value),
before_no_current = cumsum(value) - value,
after = sum(value) - before_no_current,
after_no_current = after - value)
#> # A tibble: 21 x 7
#> # Groups: SITE [3]
#> SITE year value before before_no_current after after_no_current
#> <dbl> <chr> <dbl> <dbl> <dbl> <dbl> <dbl>
#> 1 1 1 4 4 0 18 14
#> 2 1 2 4 8 4 14 10
#> 3 1 3 1 9 8 10 9
#> 4 1 4 5 14 9 9 4
#> 5 1 5 2 16 14 4 2
#> 6 1 6 1 17 16 2 1
#> 7 1 7 1 18 17 1 0
#> 8 2 1 2 2 0 8 6
#> 9 2 2 0 2 2 6 6
#> 10 2 3 0 2 2 6 6
#> # ... with 11 more rows
由代表 package (v2.0.1) 於 2022 年 1 月 24 日創建
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.