有一个准长格式的 df :
df <- data.frame(X= c(1,2,1,2,1,2,1,2),
Y= c(1,2,1,2,1,2,1,2),
variable = c("A","A","B","B","A","A","B","B"),
value = c(.5,.6,1000,1000,.7,.8,2000,2000))
目标是,对于每个唯一的 X,Y 配对(有 2) , 1.) 执行 lm,其中变量 A(其关联值)作为响应变量,变量 B 作为预测变量(其关联值) ,然后 2.) 确定(如果可能,则绑定)生成响应值 0 的预测变量值。
我已将变量列转换为因子,然后尝试了pivot_wider、pivot_longer、dcast等,显然没有效果,因为变量具有重复的名称(如果转换为因子,则为因子级别)。无需进一步旋转,就可以运行 lm 并确定 0 点,然后将其绑定到每个唯一 X,Y 配对的原始 df。
这是所需输出的示例,其中最后一列将被填充:
desired <- data.frame(X= c(1,2),
Y= c(1,2),
pred_value_B_when_response_A_equals_0 = c(NA,NA))
根据要求,这是原始的宽格式
df_wide <- data.frame(X=c(1,2),
Y=c(1,2),
A=c(.5,.6),
B=c(1000,1000),
A1=c(.7,.8),
B1=c(2000,2000))
然后我表演了
df <- reshape2::melt(df_wide,
id.vars = c("X","Y"))
使用宽数据,将其重新排列如下所示:
new_dat <- df_wide %>%
rename_with(~str_replace(.x,'(A|B)$', '\\10')) %>%
pivot_longer(A0:B1, names_to = c('.value', 'grp'),
names_pattern = '(.)(.)')
X Y grp A B
<dbl> <dbl> <chr> <dbl> <dbl>
1 1 1 0 0.5 1000
2 1 1 1 0.7 2000
3 2 2 0 0.6 1000
4 2 2 1 0.8 2000
现在在上面的数据中,您可以轻松地按 X 和 Y 进行分组,并针对 B 运行 A 的线性模型:
new_dat %>%
summarise(model=list(lm(A~B)), .by = c(X,Y))
# A tibble: 2 × 3
X Y model
<dbl> <dbl> <list>
1 1 1 <lm>
2 2 2 <lm>
您现在可以使用每组拟合的线性模型来进行预测等