从函数返回数据框并将其存储在工作区中

use*_*822 5 r return dataframe assign

这是我与R合作的第一周,有一件事我似乎无法管理.

df <- data.frame(a = c(1:10),
             b = c("a", "a", "b", "c", "c", "b", "a", "c", "c", "b"))

testF = function(select) {
dum = subset(df, b == select)
}

lapply(unique(df$b), testF)
Run Code Online (Sandbox Code Playgroud)

此功能现在只是在屏幕上打印数据集.但我想将结果存储在我的工作区中作为单独的数据框.在这个例子中,这将给出三个数据帧; a,b和c.

谢谢你的帮助.

Jor*_*eys 2

split()罗兰针对具体问题有正确的解决方案:不需要多于一个。只是为了确保:split()返回一个列表。要在工作区中获取单独的数据框,您可以:

list2env(split(df,df$b),.GlobalEnv)
Run Code Online (Sandbox Code Playgroud)

或者,使用分配:

tmp <- split(df,df$b)
for(i in names(tmp)) assign(i,tmp[[i]])
Run Code Online (Sandbox Code Playgroud)

关于子集的一句话

这就是说,更多关于为什么你的函数是错误的细节。首先,在?subset您阅读的内容中:

警告

这是一个旨在交互使用的便利功能。对于编程,最好使用标准子集函数,例如 [,特别是参数子集的非标准评估可能会产生意想不到的后果。

翻译为:一生中永远不要subset()再在函数中使用。


关于函数返回值的一句话

除此之外,函数总是返回结果:

  • 如果return()使用语句,它将返回作为 的参数给出的任何内容return()
  • 否则返回最后一行的结果。

在您的情况下,最后一行包含一个作业。现在,赋值也会返回一个值,但您看不到它。已经退回来invisibly了 您可以通过将其括在括号中来查看它,例如:

> x <- 10
> (x <- 20)
[1] 20
Run Code Online (Sandbox Code Playgroud)

这是完全没有必要的。这就是为什么你的函数在lapply()(lapply 捕获不可见输出)中使用时可以工作,但在命令行中使用时不会给你任何(可见)输出。不过你可以捕获它:

> testF("b")
> x <- testF("b")
> x
    a b
3   3 b
6   6 b
10 10 b
Run Code Online (Sandbox Code Playgroud)

函数中的赋值没有意义:要么dum显式返回,要么完全删除赋值


纠正你的功能

因此,鉴于这只是一个示例,仅使用split()您的函数并不能解决真正的问题:

testF <- function(select) {
    dum <- df[df$b=select,]
    return(dum)
}
Run Code Online (Sandbox Code Playgroud)

或者简单地:

testF <- function(select){
    df[df$b=select,]
}
Run Code Online (Sandbox Code Playgroud)