1. dplyr/tidyr
「ワイド」形式を「ロング」形式に変換した方がよい場合があります。dplyr/tidyr
を取得するために使用できますmean
。「ind」列を作成し、 を使用してデータを「long」に再形成しgather
、「変数」列を で 2 つの列 (「var1」、「var2」) に分割し、extract
「ind」でグループ化しmean
、「値」の値を取得します。作成された異なる論理インデックス (つまりvar2 < startyear
、、、var2 >= startyear & var2 <= endyear
およびvar2 >endyear
)に基づいてサブセット化した後の列
library(dplyr)
library(tidyr)
dS <- df %>%
mutate(ind=row_number()) %>%
gather(variable, value, starts_with('y')) %>%
extract(variable, c('var1', 'var2'), '([^0-9]+)([0-9]+)',
convert=TRUE) %>%
group_by(ind) %>%
summarise(before_mean= mean(value[var2 < startyear]),
within_mean = mean(value[var2 >= startyear &
var2 <= endyear]),
after_mean=mean(value[var2 >endyear])) %>%
as.data.frame()
nm1 <- paste(c('before', 'within', 'after'), 'mean', sep="_")
dS
# ind before_mean within_mean after_mean
#1 1 629.6667 44.0 65.0
#2 2 636.0000 57.2 1179.4
上記の出力から「df」に追加の列を作成できます
df[nm1] <- dS
2.ベースR
base R
データセットの形式を変更せずにメソッドを使用できます。元のデータセット ('df') から、数値列名のインデックス ('indx') を作成し、非数値部分を削除して数値 ('v1') に変換します。
indx <- grep('\\d+', names(df))
v1 <- as.numeric(sub('[^0-9]+', '', names(df)[indx]))
'df' ( lapply
)の行、 match
'v1' で 'startyear' をループし、そのインデックス ('i1') を使用して列を取得しunlist
、 を計算しmean
ます。'endyear' を 'v1' と照合してインデックス ('i2') を取得することで、同じことができます。「i1」と「i2」に基づいて、「within_mean」と「after_mean」を計算します。 rbind
リスト要素と出力を「df」の新しい列 (「nm1」) に割り当てます。
df[nm1] <- do.call(rbind,lapply(1:nrow(df), function(i) {
i1 <- match(df$startyear[i], v1)
before_mean<- mean(unlist(df[i,1:(i1-1),drop=FALSE]))
i2 <- match(df$endyear[i], v1)
within_mean <- mean(unlist(df[i,i2:i1]))
after_mean <- mean(unlist(df[i,match(v1[(i2+1):length(v1)],v1)]))
data.frame(before_mean,within_mean, after_mean) }))
df[nm1]
# before_mean within_mean after_mean
#1 629.6667 44.0 65.0
#2 636.0000 57.2 1179.4