首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >对数据迭代函数,然后将结果分离到不同的对象中

对数据迭代函数,然后将结果分离到不同的对象中
EN

Stack Overflow用户
提问于 2021-03-13 08:58:10
回答 1查看 54关注 0票数 0

我对在r中迭代一些函数很感兴趣。

具体地说,我希望使用一个线性模型在diamonds数据集上运行代码,其中IV是price,而IV使用变量caratxyz从一个模型到另一个模型变化。我希望这些单独的模型存储在唯一的对象中(例如,对于carat,名称将是lm_IV_price_carat,而对于x,对象的名称将是`lm_IV_price_x).

然后,我想使用这些唯一的对象来创建具有lm()对象摘要的唯一对象(例如,lm_IV_price_carat的摘要将称为summary_lm_IV_price_caratlm_IV_price_x的摘要将为summary_lm_IV_price_x)。

我可以在没有迭代的情况下做很长时间的工作,但是用更少的代码做这件事有可能吗?如果是这样,将如何做到这一点?

编辑1:稍微更改了标题,并使示例更简短、更具体。

我被告知这将是一个好主意,使例子更具体。

我想要做的是在各种不同的变量上一遍又一遍地运行相同的基本代码集,而不必在每次想要更改变量时重复和写出所有代码。我可以做的很长,但我不知道如何在r中用更短的方式来做,我想知道有没有更短的方法。

下面是我想要做的事情,以及相应的代码,使用的是长版本:

(1)创建一个泛型lm()对象,该对象仅根据使用的DV而变化,以`carat开头。

代码语言:javascript
运行
复制
#### creates lm()
lm_IV_price <- lm(carat ~ price, data = diamonds)

(2)创建lm对象的泛型summary()对象,以carat开头。

代码语言:javascript
运行
复制
#### creates summary of data
summary_lm_IV_price <- summary(lm_IV_price)

(3)为这些lm()和summary()泛型对象提供唯一的名称。

代码语言:javascript
运行
复制
#### creates unique names for lm_IV_price
# ---- NOTE: generates name to use for object created
name_lm_IV_price <- paste("lm_IV_price","_",as.character(lm_IV_price$call$formula[[2]]), sep = "")
# ---- NOTE: creates unique object
assign(name_lm_IV_price, lm_IV_price)

#### creates unique names for summary_lm_IV_price
# ---- NOTE: generates name to use for object created
name_summary_lm_IV_price <- paste("summary_lm_IV_price","_",as.character(summary_lm_IV_price$call$formula[[2]]), sep = "")
# ---- NOTE: creates unique object
assign(name_summary_lm_IV_price, summary_lm_IV_price)

(4)使用变量xyz重复步骤1-3。请看下面的代码,了解我是如何做到这一点的(例如,我复制了第一个代码集,然后使用了查找和替换)。

我想知道是否有一种方法可以使用较少的r代码更快地完成这项任务。

下面是长版本的代码:

代码语言:javascript
运行
复制
# loads ggplot2 package
if(!require(ggplot2)){install.packages("ggplot2")} # ---- NOTE: relates to mlm analyses


# runs lm, and summary

## when DV = carat

### creates general model objects

#### creates lm()
lm_IV_price <- lm(carat ~ price, data = diamonds)

#### creates summary of data
summary_lm_IV_price <- summary(lm_IV_price)

### creates unique names for general model objects

#### creates unique names for lm_IV_price
# ---- NOTE: generates name to use for object created
name_lm_IV_price <- paste("lm_IV_price","_",as.character(lm_IV_price$call$formula[[2]]), sep = "")
# ---- NOTE: creates unique object
assign(name_lm_IV_price, lm_IV_price)

#### creates unique names for summary_lm_IV_price
# ---- NOTE: generates name to use for object created
name_summary_lm_IV_price <- paste("summary_lm_IV_price","_",as.character(summary_lm_IV_price$call$formula[[2]]), sep = "")
# ---- NOTE: creates unique object
assign(name_summary_lm_IV_price, summary_lm_IV_price)

## when DV = x

### creates general model objects

#### creates lm()
lm_IV_price <- lm(x ~ price, data = diamonds)

#### creates summary of data
summary_lm_IV_price <- summary(lm_IV_price)

### creates unique names for general model objects

#### creates unique names for lm_IV_price
# ---- NOTE: generates name to use for object created
name_lm_IV_price <- paste("lm_IV_price","_",as.character(lm_IV_price$call$formula[[2]]), sep = "")
# ---- NOTE: creates unique object
assign(name_lm_IV_price, lm_IV_price)

#### creates unique names for summary_lm_IV_price
# ---- NOTE: generates name to use for object created
name_summary_lm_IV_price <- paste("summary_lm_IV_price","_",as.character(summary_lm_IV_price$call$formula[[2]]), sep = "")
# ---- NOTE: creates unique object
assign(name_summary_lm_IV_price, summary_lm_IV_price)

## when DV = y

### creates general model objects

#### creates lm()
lm_IV_price <- lm(y ~ price, data = diamonds)

#### creates summary of data
summary_lm_IV_price <- summary(lm_IV_price)

### creates unique names for general model objects

#### creates unique names for lm_IV_price
# ---- NOTE: generates name to use for object created
name_lm_IV_price <- paste("lm_IV_price","_",as.character(lm_IV_price$call$formula[[2]]), sep = "")
# ---- NOTE: creates unique object
assign(name_lm_IV_price, lm_IV_price)

#### creates unique names for summary_lm_IV_price
# ---- NOTE: generates name to use for object created
name_summary_lm_IV_price <- paste("summary_lm_IV_price","_",as.character(summary_lm_IV_price$call$formula[[2]]), sep = "")
# ---- NOTE: creates unique object
assign(name_summary_lm_IV_price, summary_lm_IV_price)

## when DV = z

### creates general model objects

#### creates lm()
lm_IV_price <- lm(z ~ price, data = diamonds)

#### creates summary of data
summary_lm_IV_price <- summary(lm_IV_price)

### creates unique names for general model objects

#### creates unique names for lm_IV_price
# ---- NOTE: generates name to use for object created
name_lm_IV_price <- paste("lm_IV_price","_",as.character(lm_IV_price$call$formula[[2]]), sep = "")
# ---- NOTE: creates unique object
assign(name_lm_IV_price, lm_IV_price)

#### creates unique names for summary_lm_IV_price
# ---- NOTE: generates name to use for object created
name_summary_lm_IV_price <- paste("summary_lm_IV_price","_",as.character(summary_lm_IV_price$call$formula[[2]]), sep = "")
# ---- NOTE: creates unique object
assign(name_summary_lm_IV_price, summary_lm_IV_price)

## displays unique models objects

### lm() objects

#### recalls unique lm() objects
apropos("lm_IV_price")

#### displays unique lm() objects
lm_IV_price_carat
lm_IV_price_x
lm_IV_price_y
lm_IV_price_z

## displays unique models objects

### lm() objects

#### recalls unique lm() objects
apropos("summary_lm_IV_price")

#### displays unique lm() objects
summary_lm_IV_price_carat
summary_lm_IV_price_x
summary_lm_IV_price_y
summary_lm_IV_price_z
EN

回答 1

Stack Overflow用户

发布于 2021-03-14 03:23:17

如果我没理解错的话,行动组想要

  • 为了使用不同的公式拟合许多线性模型,
  • 创建每个模型的摘要,
  • 并在全局环境中创建单独的对象,最后。

我的首选方法是尽可能长地将相同结构的数据放在一个更大的数据对象中,例如列表,以避免将许多单个对象弄乱工作区。但是,如果OP坚持,可以使用list2env()从命名列表轻松创建单个对象。

好吧,这就是我要做的

创建已装配模型的列表

代码语言:javascript
运行
复制
# define variables
ivar <- "price"
dvars <- setdiff(names(ggplot2::diamonds), ivar)[c(1, 7:9)] # carat, x, y, z

# create character vectors of formulae and names 
formulae <- paste(dvars, "~", ivar)
lm_names <- sprintf("lm_IV_%s_%s", ivar, dvars)

# loop over formulae to fit models
lm_list <- lapply(formulae, function(f) eval(bquote(lm(.(f), data = ggplot2::diamonds))))
# name list elements
lm_list <- setNames(lm_list, lm_names)

lm_list

$lm_IV_price_carat调用: lm(formula =“克拉~价格”,data =ggplot2::菱形)系数:(截取)价格0.3672972 0.0001095 $lm_IV_price_x调用: lm(formula = "x ~ price",data =GGPLOT2::菱形)系数:(截取)价格4.7531182 0.0002487 $lm_IV_price_y调用: lm(formula = "y ~ price",$lm_IV_price_z调用: lm(formula = "z ~ price",data =GGPLOT2::菱形)系数:(截取)价格2.9395800 0.0001523

lm_list是一个包含拟合这四个模型的结果的列表。列表元素根据OP的请求进行命名。

在列表中的每个型号上应用summary()函数(或任何其他合适的函数,例如coef())是很简单的:

代码语言:javascript
运行
复制
lapply(lm_list, summary)

$lm_IV_price_carat调用:lm(公式=“克拉~价格”,数据=ggplot2::菱形)残差: Min 1Q中值3Q Max -1.35765 -0.11329 -0.02442 0.10344 2.66973系数:估计标准。错误t值Pr(>|t|) (截取) 3.673e-01 1.112e-03 330.2 <2e-16 *价格1.095e-04 1.986e-07 551.4 <2e-16 *-- Signif。编码: 0.001‘*’0.001‘**’0.01‘*’0.05‘. 0.1’‘1剩余标准差: 53938自由度上的0.184倍数R平方: 0.8493,调整后的R平方: 0.8493 F-统计量:1和53938 DF上的3.041e+05,p值:< 2.2e-16 $lm_IV_price_x调用:lm(公式= "x ~价格“,data =ggplot2::菱形)残差:最小1Q中值3Q最大-9.2380 -0.4204 0.0200 0.3935 2.8574系数:估计标准差。错误t值Pr(>|t|) (截取) 4.753e+00 3.165e-03 1501.7 <2e-16 *价格2.487e-04 5.650e-07 440.2 <2e-16 *-- Signif。编码: 0.001‘*’0.001‘**’0.01‘*’0.05‘. 0.1’‘1剩余标准差: 53938自由度上的0.5235倍数R平方: 0.7822,调整后的R平方: 0.7822 F-统计量:1和53938 DF上的1.937e+05,p值:< 2.2e-16 $lm_IV_price_y调用:lm(公式= "y ~价格“,data =ggplot2::菱形)残差:最小1Q中值3Q最大-9.228 -0.416 0.022 0.392 51.115系数:估计标准差。错误t值Pr(>|t|) (截取) 4.760e+00 3.460e-03 1375.8 <2e-16 *价格2.478e-04 6.176e-07 401.1 <2e-16 *-- Signif。编码: 0.001‘*’0.001‘**’0.01‘*’0.05‘. 0.1’‘1剩余标准差: 53938自由度上的0.5723倍数R平方: 0.749,调整后的R平方: 0.7489 F-统计量:1和53938 DF上的1.609e+05,p值:< 2.2e-16 $lm_IV_price_z调用:lm(公式= "z ~价格“,data =ggplot2::菱形)残差:最小1Q中值3Q最大-5.8019 -0.2669 0.0090 0.2482 28.5603系数:估计标准差。错误t值Pr(>|t|) (截取) 2.940e+00 2.168e-03 1355.7 <2e-16 *价格1.523e-04 3.871e-07 393.6 <2e-16 *-- Signif.编码: 0.001‘*’0.001‘**’0.01‘*’0.05‘. 0.1’‘1剩余标准误差: 53938自由度上的0.3586倍数R平方: 0.7418,调整后的R平方: 0.7417 F-统计量:1和53938 DF上的1.549e+05,p值:< 2.2e-16

结果又是一个命名列表。

在工作区中创建唯一对象

我会继续使用列表,但OP已经要求将单个模型存储在唯一的对象中。

这可以通过以下方式实现

代码语言:javascript
运行
复制
list2env(lm_list, .GlobalEnv)

这将在工作区中创建四个对象:

代码语言:javascript
运行
复制
apropos("lm_IV")

1 "lm_IV_price_carat“"lm_IV_price_x”"lm_IV_price_y“"lm_IV_price_z”

为摘要创建唯一对象有点单调乏味,因为我们必须重命名列表元素:

代码语言:javascript
运行
复制
library(magrittr) # piping used to improve readability
lapply(lm_list, summary) %>% 
  set_names(paste0("summary_", names(.))) %>% 
  list2env(.GlobalEnv)

apropos("summary_lm_IV")

1 "summary_lm_IV_price_carat“"summary_lm_IV_price_x”"summary_lm_IV_price_y“4 "summary_lm_IV_price_z”

eval(bquote(lm(.(f), data = ggplot2::diamonds))))的解释

我的第一次尝试是

代码语言:javascript
运行
复制
lm_list <- lapply(formulae, function(f) lm(f, data = ggplot2::diamonds))

它工作得很好,除了公式摘要,例如,从lm()and carat ~ price ()`的输出中消失:

调用:lm(公式= f,数据=ggplot2::菱形)

注意,公式信息仍然包含在模型中,可以通过以下方式进行演示

代码语言:javascript
运行
复制
lapply(formulae, function(f) format(terms(lm(f, data = ggplot2::diamonds))))

[1]“克拉~价格”[2] "x ~价格“[3] "y ~价格”[4] "z ~价格“

John Mount的文章R Tip: How to Pass a formula to lm建议使用eval()bquote().()模式。

或者,wrapr::let()也可以工作:

代码语言:javascript
运行
复制
lapply(dvars, function(dv) wrapr::let(c(DV = dv, IV = "price"), lm(DV ~ IV, data = ggplot2::diamonds)))

代码语言:javascript
运行
复制
lapply(dvars, function(dv) wrapr::let(c(DV = dv), lm(DV ~ price, data = ggplot2::diamonds)))
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66609100

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档