首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从R中的函数创建数据帧

从R中的函数创建数据帧
EN

Stack Overflow用户
提问于 2015-01-06 16:17:27
回答 2查看 8.6K关注 0票数 1

我编写了一个函数,它可以创建一个数据框架:(这个函数修改了全局环境!)

代码语言:javascript
复制
abc=function(x,y) {
   if(y>=11)
    stop("Noooooooooooooooooooooooooope!")
     value = NA
  for (i in 1:10) {
    a=2+i
    b=3
    value[i]=(x+a)*(b*y)
  }
  df=data.frame(ID=(1:10),Value=(value)) 
  assign("df",df,envir = .GlobalEnv)
  View(df)
}
abc(2,9)

此函数创建如下数据框架:

代码语言:javascript
复制
    ID  Value
1   1   135
2   2   162
3   3   189
4   4   216
5   5   243
6   6   270
7   7   297
8   8   324
9   9   351
10  10  378

但是现在我需要创建一个“大”数据框架,其中将包含更多的列。对于论点abc(1,9),abc(2,9),abc(3,9) .abc(13,9)。新的数据框架如下所示:

代码语言:javascript
复制
    ID  Value1  Value2 Value3 ...
1   1   108 135 ...
2   2   135 162 ...
3   3   162 189 ...
4   4   189 216 ...
5   5   216 243 ...
6   6   243 ... ...
7   7   270 ... ...
8   8   297 ... ...
9   9   324 ... ...
10  10  351 ... ...

我怎么能做到呢?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-01-06 16:24:47

您可以从函数的数据框架中删除ID列,而不是assign调用,只需return value向量即可。然后以这样的方式进行:

代码语言:javascript
复制
df<- data.frame(ID=1:10, Value1=abc(1,9), Value2=abc(2,9), Value3=abc(3,9))

当然,根据你对“大”的定义,这可能是低效的,也可能是不可行的。

票数 0
EN

Stack Overflow用户

发布于 2015-01-06 16:26:13

不是最优雅的,但也不算太糟:

首先,我修改了您的函数,因为我觉得View很烦人,所以显式地返回一个东西要好得多,而不是只把它放在全局环境中:

代码语言:javascript
复制
abc=function(x,y) {
    if(y>=11)
        stop("Noooooooooooooooooooooooooope!")
    value = NA
    for (i in 1:10) {
        a=2+i
        b=3
        value[i]=(x+a)*(b*y)
    }
    df=data.frame(ID=(1:10),Value=(value)) 
    #assign("df",df,envir = .GlobalEnv)
    #View(df)
}

现在要为x = 1:13运行它并组合结果:

代码语言:javascript
复制
dflist = lapply(1:13, abc, y = 9)
for (i in seq_along(dflist)) {
    names(dflist[[i]])[2] = paste0("Value", i)
}
bigdf = Reduce(function(...) merge(..., all = T), dflist)

(使用this answer中的方法)

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27802692

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档