use*_*480 5 loops r function mean sapply
我想在数据帧上循环一个函数,并将函数中的信息添加到数据帧中。我已经阅读了许多有关循环和将函数应用于数据帧的相关文章,这些文章让我接近了我所需要的,但还不够,所以我希望人们可以帮助我。
我有许多看起来像这样的数据框
dat1=as.data.frame(matrix(rnorm(25),ncol=5))
dat2=as.data.frame(matrix(rnorm(25),ncol=5))
dat3=as.data.frame(matrix(rnorm(25),ncol=5))
Run Code Online (Sandbox Code Playgroud)
我想计算其中一些列的平均值并添加到数据框的末尾。因此,我编写了一个函数来计算数据帧的平均值:
my_fun <- function(dataframe){
rowMeans( dataframe[ , c("V1","V2")],na.rm=TRUE)
}
Run Code Online (Sandbox Code Playgroud)
要将此函数应用于一个数据帧,我这样做:
dat1$V6<- my_fun(dat1)
Run Code Online (Sandbox Code Playgroud)
但我希望能够循环所有数据帧并将此平均列添加到每个 df 的末尾。
阅读了一些有用的帖子后,我创建了一个列表并使用了 sapply:
dfList<-list(dat1,dat2,dat3)#create list
sapply(dfList, my_fun) #apply function to list
Run Code Online (Sandbox Code Playgroud)
这给了我想要的值,但我不希望它们在单独的输出中 - 我希望它们简单地在原始数据帧上添加一列 - 就像我将函数应用于各个数据帧时发生的那样。谁能告诉我该怎么做?或者向我指出一篇描述如何执行此操作的帖子(我已经进行了高低搜索,但可能输入了错误的关键字),如果您知道如何操作,我确信它非常简单!
尝试这个:
只是为了消除混乱。
dat1=as.data.frame(matrix(rnorm(25),ncol=5))
dat5=as.data.frame(matrix(rnorm(25),ncol=5))
dat7=as.data.frame(matrix(rnorm(25),ncol=5))
my_fun <- function(dataframe){
rowMeans( dataframe[ , c("V1","V2")],na.rm=TRUE)
}
dfList<-list(dat1,dat5,dat7)
Vars <- grep("dat", ls(), value=TRUE)
Vars
#[1] "dat1" "dat5" "dat7"
res <- lapply(dfList, function(x) transform(x,V6=my_fun(x)))
for(i in 1:length(Vars)){
assign(Vars[i], res[[i]],envir=.GlobalEnv)
}
Run Code Online (Sandbox Code Playgroud)
第二个函数:
my_funSD <- function(dataframe){
apply( dataframe[ , c("V1","V2")],1,sd)
}
dfList<-list(dat1,dat5,dat7)
res1 <- lapply(dfList, function(x) transform(x,V7=my_funSD(x)))
ncol(dat1)
#[1] 6
for(i in 1:length(Vars)){
assign(Vars[i], res1[[i]],envir=.GlobalEnv)
}
ncol(dat1)
#[1] 7
colnames(dat1)
[1] "V1" "V2" "V3" "V4" "V5" "V6" "V7"
Run Code Online (Sandbox Code Playgroud)