如何从具有较少连续向量函数创建大 Dataframe

yrdbyhpb  于 2022-12-20  发布在  其他
关注(0)|答案(2)|浏览(107)

我有一个基于4个主要因素的函数。我希望该函数产生一个 Dataframe 的结果。

gnd <- function(a,b,c,d) {
  e <- a*b
  number_red <- b*e
  number_leaf_red <- b*e*6
  number_blue <- c*d*e
  total_number1<- sum(number_red, number_blue)
  type <- as.factor(c("number_red","number_leaf_red","number_blue"))
  a.prob<-rep(a, 3)
  b.prob<-rep(b, 3)
  value <- c(number_red, number_leaf_red, number_blue)
  data.frame(type,a.prob,b.prob , value)
}

但是当我想在这个函数上做一个“for”函数时,我得到了一个 Dataframe 列表。
a〈- c(0.1、0.2、0.3、0.4)

for (i in a) {
  h<-  gnd(a,0.1,0.3,0.4)
  print(h)}

如何以函数将产生一个大 Dataframe 的方式为每个参数(a、B、c、d)应用不同的向量(如下面的示例

a <- c(0.1, 0.2,0.3,0.4)
b <- c(0.1, 0.2,0.3,0.4)
c <- c(0.1, 0.2,0.3,0.4)
d <- c(0.1, 0.2,0.3,0.4)

for (i in x) {
  h<-  gnd(x,2,3,4)
  print(h)}

预先感谢你的帮助

dkqlctbz

dkqlctbz1#

我们可以使用Maprbindlist输出到单个 Dataframe 中

do.call(rbind, Map(gnd, a, b, c, d))
  • 输出
type a.prob b.prob  value
1       number_red    0.1    0.1 0.0010
2  number_leaf_red    0.1    0.1 0.0060
3      number_blue    0.1    0.1 0.0001
4       number_red    0.2    0.2 0.0080
5  number_leaf_red    0.2    0.2 0.0480
6      number_blue    0.2    0.2 0.0016
7       number_red    0.3    0.3 0.0270
8  number_leaf_red    0.3    0.3 0.1620
9      number_blue    0.3    0.3 0.0081
10      number_red    0.4    0.4 0.0640
11 number_leaf_red    0.4    0.4 0.3840
12     number_blue    0.4    0.4 0.0256

或使用for循环

out <- data.frame()
for(i in seq_along(a)) out <- rbind(out, gnd(a[i], b[i], c[i], d[i]))
  • 输出
> out
              type a.prob b.prob  value
1       number_red    0.1    0.1 0.0010
2  number_leaf_red    0.1    0.1 0.0060
3      number_blue    0.1    0.1 0.0001
4       number_red    0.2    0.2 0.0080
5  number_leaf_red    0.2    0.2 0.0480
6      number_blue    0.2    0.2 0.0016
7       number_red    0.3    0.3 0.0270
8  number_leaf_red    0.3    0.3 0.1620
9      number_blue    0.3    0.3 0.0081
10      number_red    0.4    0.4 0.0640
11 number_leaf_red    0.4    0.4 0.3840
12     number_blue    0.4    0.4 0.0256
1cklez4t

1cklez4t2#

对于a、b、c、d的不同组合,您需要使用tidyverse中的pmap函数。由于您在input中有4个元素,因此df的总长度为768。我编辑了您的代码以查看不同的组合和结果

gnd <- function(a,b,c,d) {
  e <- a*b
  number_red <- b*e
  number_leaf_red <- b*e*6
  number_blue <- c*d*e
  total_number1<- sum(number_red, number_blue)
  type <- as.factor(c("number_red","number_leaf_red","number_blue"))
  a.prob<-rep(a, 3)
  b.prob<-rep(b, 3)
  value <- c(number_red, number_leaf_red, number_blue)
  data.frame(a,b,c,d,type,a.prob,b.prob , value)
}

a <- c(0.1, 0.2,0.3,0.4)
b <- c(0.1, 0.2,0.3,0.4)
c <- c(0.1, 0.2,0.3,0.4)
d <- c(0.1, 0.2,0.3,0.4)
x<-as.list(expand.grid(list(a,b,c,d))) ## creating different combination

df<-pmap_df(list(x$Var1,x$Var2,x$Var3,x$Var4),gnd)

相关问题