在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))
我想做什么,
简而言之,我希望创建一个用户定义的函数,该函数可以执行以下操作:
lm(measure1~measure2, data)
我的想法/我已经尝试过的首先是值得我澄清为什么我想要一个函数来做这件事。简单地说,我有大约10个相似的数据集。我想对所有数据集执行这些操作。我只需要创建一个大数据集并将它们组合起来,但是物流是有问题的。所以,我决定写一个函数会更容易。
Problem1
Filt.data<- function(x,y,z){
new.data<<-x[x$measure1 %in% c(y,z), ]
new.data
}
上面的代码工作得很好,允许我使用变量y和z输入任何数据"x“和子集(这是度量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“是我执行过的参与者(或类似的).Once的数目--我认为这一步可以简单地对数据执行线性模型作为列表吗?但是,我又遇到了同样的问题:如何创建一个变量来存储每个线性模型的结果?
我对R很陌生,不用那么频繁地使用。我已经尝试过查找类似的问题,但只是整个索引[我]符号只是把我搞砸了!所以,快速请求:如果有人觉得自己能够生成代码,他们还能添加一些注释吗?这将帮助我在未来能够再次做到这一点,并理解机制。
一如既往,感谢你们的英雄们,他们把时间花在了(1)读这个和(2)提供支持!
干杯。
发布于 2021-04-23 02:43:15
这不是一个好的做法
assign
.<<-
或individual
单独的数据格式。您应该使用list代替.试试这种方法:
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))
https://stackoverflow.com/questions/67228386
复制相似问题