R教科书继续推广使用lapply而不是循环.即使对于带有参数的函数,这也很容易
lapply(somelist, f, a=1, b=2)
Run Code Online (Sandbox Code Playgroud)
但是如果参数根据列表元素而改变怎么办?假设我的名单包括:
somelist$USA
somelist$Europe
somelist$Switzerland
Run Code Online (Sandbox Code Playgroud)
加上有anotherlist相同的地区,我想用这些不断变化的论点来讨价还价?例如,当f是比率计算时,这可能是有用的.
lapply(somelist, f, a= somelist$USA, b=anotherlist$USA)
Run Code Online (Sandbox Code Playgroud)
是否有方法可以有效地运行这些区域?
编辑:我的问题似乎是我试图使用以前编写的函数没有索引...
ratio <-function(a,b){
z<-(b-a)/a
return(z)
}
Run Code Online (Sandbox Code Playgroud)
这导致了
lapply(data,ratio,names(data))
Run Code Online (Sandbox Code Playgroud)
这不起作用.也许其他人也可以从这个错误中吸取教训
我有很多.RData文件,包含我在之前分析中保存的一个数据帧,并且数据框对于每个加载的文件都具有相同的名称.所以例如使用load(file1.RData)我得到一个名为'df'的数据框,然后使用load(file2.RData)我得到一个名为'df'的数据框.我在想,如果这是在所有可能的,因为我需要一次加载所有这些,与每名所有这些.RData文件合并成一个大的.RData文件Df等于文件名称,这样我就可以使用不同的数据帧.
我可以使用下面的代码执行此操作,但它非常复杂,必须有一个更简单的方法来执行此操作...感谢您的建议.
假设我有3个.RData文件,并希望将所有文件保存在名为"main.RData"的文件中,并使用其特定名称(现在它们都以"df"形式出现):
all.files = c("/Users/fra/file1.RData", "/Users/fra/file2.RData", "/Users/fra/file3.RData")
assign(gsub("/Users/fra/", "", all.files[1]), local(get(load(all.files[1]))))
rm(list= ls()[!(ls() %in% (ls(pattern = "file")))])
save.image(file="main.RData")
all.files = all.files = c("/Users/fra/file1.RData", "/Users/fra/file2.RData", "/Users/fra/file3.RData")
for (f in all.files[-1]) {
assign(gsub("/Users/fra/", "", f), local(get(load(f))))
rm(list= ls()[!(ls() %in% (ls(pattern = "file")))])
save.image(file="main.RData")
}
Run Code Online (Sandbox Code Playgroud) 使用两个数据帧df1和df2定义列表dats
dats <- list( df1 = data.frame(a=sample(1:3), b = sample(11:13)),
df2 = data.frame(a=sample(1:3), b = sample(11:13)))
> dats
$df1
a b
1 2 12
2 3 11
3 1 13
$df2
a b
1 3 13
2 2 11
3 1 12
Run Code Online (Sandbox Code Playgroud)
我想在每个数据框中删除变量a.接下来,我想添加一个变量,其中包含来自外部数据帧的每个数据帧的id,如:
ids <- data.frame(id=c("id1","id2"),df=c("df1","df2"))
> ids
id df
1 id1 df1
2 id2 df2
Run Code Online (Sandbox Code Playgroud)
为了放弃不必要的变量,我试着没有运气:
> dats <- lapply(dats, function(x) assign(x, x[,c("b")]))
> Error in assign(x, x[, c("b")]) : invalid first …Run Code Online (Sandbox Code Playgroud)