我在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和2的相关行
- 获取子集数据,并为数据集中的每个个体创建一个新的数据帧
- 在每个新的数据帧上,以以下形式创建一个线性模型
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))