簡體   English   中英

采用包含一些重疊列 dplyr tidyverse 的兩組的行方式

[英]take row-wise means of two groups containing some overlapping columns dplyr tidyverse

我有一個 x,y 坐標的 df 和一個經過多年的變量。 我正在嘗試對年份進行分組,並采用仍然在每個 x/y 坐標中的每個組的方法。 有時這些組包含一些相同的年份,我不知道該怎么做。 (例如,將每個坐標點的 2000-2005 年平均值與 2003-2008 年平均值進行比較)。 感覺這應該不難,但我正在循環編碼自己。 我還需要它是程序化的,因為年份組會發生變化。

我更願意將其保留在 tidyverse 語法中。

代表:


set.seed(0)
# make df
df <- data.frame(
  x = 1:50,
  y = 201:250,
  var1999 = sample(c(10:50,NA),50,replace = T), # there may be occasionally NAs as well
  var2000 = sample(c(100:50,NA),50,replace = T),
  var2001 = sample(c(100:500,NA),50,replace = T),
  var2002 = sample(c(100:500,NA),50,replace = T),
  var2003 = sample(c(100:500,NA),50,replace = T),
  var2004 = sample(c(100:200,NA),50,replace = T)
)

year_group1 <- c(1999:2002)
year_group2 <- c(2002:2004) # note that 2002 will be in both groups

# desired output: (ignore the numbers, they are made up)
    x   y   mean_year_group1  mean_year_group2    delta 
1   1  201      184.5               324              20
2   2  202      155.9               118              43
3   3  203      162.3               470              21
4   4  204      144.1               496              23
5   5  205      183.2               405              55

到目前為止,我已經嘗試選擇 year_group1 列,然后取它們的平均值(即使這樣也行不通,令人困惑。),我打算只在兩個不同的集合中做它們,然后將平均值合並在一起並找出它們之間的變化。 我敢肯定,那里的一些 tidyverse 專家有更好的方法。

這是沒有用的:

df %>%
  select(x,y, paste0("var",year_group1)) %>%
  mutate( mean = mean(c(var1999, var2000, var2001, var2002)))

df %>%
  select(x,y, paste0("var",year_group1)) %>%
  dplyr::rename_at(vars(contains("var",ignore.case = F)), list(~ paste0("yeargroup1", .))) %>%
  mutate(mean = mean(contains("year1")))

謝謝!

我們可以使用select對數據進行子集化(由於列名不完全匹配,使用matches項或可以paste 'var' 作為前綴,然后將其包裝在select內的all_of中)並使用每個組的transmute rowMeans

library(dplyr)
library(stringr)
df %>%
   transmute(x, y,
    mean_year_group1 = rowMeans(select(., 
       matches(str_c(year_group1, collapse="|"))), na.rm = TRUE), 
   mean_year_group2 = rowMeans(select(., matches(str_c(year_group2, 
          collapse="|"))), na.rm = TRUE))

或使用collapse ,使用dapplyfmean進行行操作

library(collapse)
yr_gr1 <- paste0('var', year_group1)
yr_gr2 <- paste0('var', year_group2)
mean1grp <- df %>%
     get_vars(yr_gr1) %>%
      dapply(FUN = fmean, MARGIN = 1)
mean2grp <- df %>%
 get_vars(yr_gr2) %>% 
 dapply(FUN = fmean, MARGIN = 1)
df %>% 
   slt(x, y) %>%
   ftransform(mean_year_group1 = mean1grp, 
              mean_year_group2 = mean2grp)

在 OP 的mean代碼中,如果我們想使用它, rowwise (但效率低下)

df %>%
  select(x,y, paste0("var",year_group1)) %>%
  rowwise %>%
  mutate( mean = mean(c(var1999, var2000, var2001, var2002))) %>%
  ungroup

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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