簡體   English   中英

R 對列和行求和以進行配對分析

[英]R Summing over Columns and Rows for a Paired Analysis

一個有一個電子表格,用戶在其中輸入前后列中的年數。 一個例子如下所示。

站點 之前 之后 Yr_1 Yr_2 Yr_3 Yr_4 Yr_5 Yr_6 Yr_7 1 2 2 4 4 1 5 2 1 1 2 2 5 2 0 0 2 2 0 2 3 1 6 1 0 2 1 0 1 1

有人想將 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.

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