从 R 中的函数创建数据框
Create data frame from function in R
我编写了一个函数,它可以创建一个数据框:(这个函数修改了全局环境!)
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)
此函数创建如下数据框:
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
但现在我需要创建一个 "big" 数据框,其中会有更多列。对于参数 abc(1,9)、abc(2,9)、abc(3,9) .... abc(13,9)。新数据框将如下所示:
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 ... ...
我怎样才能做到?
您可以从函数的数据框中删除 ID
列,而不是 assign
调用,只是 return
value
向量。然后这样进行:
df<- data.frame(ID=1:10, Value1=abc(1,9), Value2=abc(2,9), Value3=abc(3,9))
当然,这可能效率低下或不可行,具体取决于您对 "big" 的定义。
不是最优雅的,但也不算太差:
首先我修改了你的函数,因为我发现 View
很烦人而且 很多 比 return 一个明确的东西更好,而不是仅仅把它贴在全球环境:
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
并合并结果:
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中的方法)
我编写了一个函数,它可以创建一个数据框:(这个函数修改了全局环境!)
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)
此函数创建如下数据框:
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
但现在我需要创建一个 "big" 数据框,其中会有更多列。对于参数 abc(1,9)、abc(2,9)、abc(3,9) .... abc(13,9)。新数据框将如下所示:
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 ... ...
我怎样才能做到?
您可以从函数的数据框中删除 ID
列,而不是 assign
调用,只是 return
value
向量。然后这样进行:
df<- data.frame(ID=1:10, Value1=abc(1,9), Value2=abc(2,9), Value3=abc(3,9))
当然,这可能效率低下或不可行,具体取决于您对 "big" 的定义。
不是最优雅的,但也不算太差:
首先我修改了你的函数,因为我发现 View
很烦人而且 很多 比 return 一个明确的东西更好,而不是仅仅把它贴在全球环境:
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
并合并结果:
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中的方法)