[英]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
,使用dapply
和fmean
進行行操作
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.