生成用户定义的R函数(或嵌套多个函数),将原始数据帧子集为每个个体的新数据帧



我在R中遇到了一个非常简单的问题,但我缺乏编写用户定义函数的经验也无济于事。

示例数据

individual = c(1, 1, 1, 1, 2, 2, 2, 2), measure1 = c(40, 
70, 90, 100, 40, 70, 90, 100), measure2 = c(1.06, 0.7, 0.507, 
0.37, 0.9, 0.56, 0.412, 0.375)), class = "data.frame", row.names = c(NA, 
-8L))

我想做什么

简而言之,我想为用户创建一个定义的函数,它可以做以下事情:

  1. 取一个数据帧,对数据进行子集设置,以便只剩下测量1和2的相关行
  2. 获取子集数据,并为数据集中的每个个体创建一个新的数据帧
  3. 在每个新的数据帧上,以以下形式创建一个线性模型lm(measure1~measure2, data)

我的想法/我尝试了什么首先,我可能值得澄清为什么我想要一个函数来做这件事。简单地说,我有大约10个类似的数据集。我想在所有数据集上执行这些操作。我可以只创建一个大数据集并将它们组合在一起,但后勤方面存在问题。所以,我决定写一个函数会更容易。

问题1

Filt.data<- function(x,y,z){
new.data<<-x[x$measure1 %in% c(y,z), ]
new.data
}

上面的代码工作得很好,并允许我输入任何数据帧";x〃;以及使用变量y和z(这是度量1的两个值(的子集。这是一个很好的第一步,但这显然会生成一个新的数据帧,其中包含所有参与者1:i的数据。所以,我的下一步是在函数中嵌套一个for循环。我想出了以下

filt.data<- function(x,y,z){
for (i in 1:length(x$participant)){
x[x$measure1 %in% c(y,z), ]
}
}

这是我所能做到的。在这一点上困扰我的是如何为每个参与者1:i创建一个唯一命名的新数据帧(即new.dat_1(;1〃;是参与者的数量(或类似的东西(。一旦我完成了这一步,我就可以简单地在数据帧上运行线性模型,我想是列表吗?但后来我又遇到了同样的问题:如何创建一个变量来存储每个线性模型的结果?

我对R很陌生,不经常使用它。我试过查找类似的问题,但整个索引[[I]]符号让我很头疼!所以,快速请求:如果有人觉得他们能够生成代码,他们能添加一些小注释吗?这将极大地帮助我在未来再次这样做,并理解其中的机制。

一如既往,感谢那些在一天中抽出时间(1(阅读本文并(2(提供支持的英雄们!

干杯。

这不是的好做法

  • 从函数内部写入全局环境。避免使用<<-assign
  • 为每个individual创建单独的数据帧。您应该使用列表

尝试这种方法:

Filt.data<- function(x,y,z) {
dat <- subset(x, measure1 %in% c(y,z))
lapply(split(dat, dat$individual), function(x) lm(measure1~measure2, x))
}
list_model <- Filt.data(df, 40, 70)
list_model
#$`1`
#Call:
#lm(formula = measure1 ~ measure2, data = x)
#Coefficients:
#(Intercept)     measure2  
#     128.33       -83.33  

#$`2`
#Call:
#lm(formula = measure1 ~ measure2, data = x)
#Coefficients:
#(Intercept)     measure2  
#     119.41       -88.24  

数据

df <- data.frame(individual = c(1, 1, 1, 1, 2, 2, 2, 2),
measure1 = c(40, 70, 90, 100, 40, 70, 90, 100), 
measure2 = c(1.06, 0.7, 0.507, 0.37, 0.9, 0.56, 0.412, 0.375))

最新更新