Основываясь на фрейме данных, представленном ниже, я бы хотел запустить формулы в столбце struct. По сути, мне нужна функция R, которая обрабатывает уравнения в столбце struct как код. Любые идеи очень приветствуются!

x <- runif(60, min = 2, max = 35)
y <- runif(60, min = 0, max = 10)
z <- runif(60, min = 5, max = 20)
struct1 <- rep("x + y + z", times = 20)
struct2 <- rep("x - y - z", times = 20)
struct3 <- rep("x * y * z", times = 20)
struct <- c(struct1, struct2, struct3)
dd <- data.frame(x, y, z, struct)
rm(x, y, z, struct, struct1, struct2, struct3)
0
user3262756 28 Май 2017 в 22:22

2 ответа

Лучший ответ

Не очень элегантно, но работает:

set.seed(1)
library(data.table)
x <- runif(60, min = 2, max = 35)
y <- runif(60, min = 0, max = 10)
z <- runif(60, min = 5, max = 20)
struct1 <- rep("x + y + z", times = 20)
struct2 <- rep("x - y - z", times = 20)
struct3 <- rep("x * y * z", times = 20)

struct <- c(struct1, struct2, struct3)
struct_1<-paste("function(x,y,z){",struct,"}",sep="")
struct_2<-paste(paste("func_",seq(1:length(struct)),"<-",sep=""),sep="")
struct<-paste(struct_2,struct_1,sep="")
struct<-paste(struct,
              paste(gsub("<-","",struct_2),"(x,y,z)",sep=""),sep="\n ")
dd <- data.frame(x, y, z, struct)
rm(x, y, z, struct, struct1, struct2, struct3)
dd<-as.data.table(dd)
dd[,needed_var:=eval(parse(text=as.character(struct))),by=1:nrow(dd)]
1
Vitalijs 28 Май 2017 в 20:01

Эта строка кода оценивает соответствующую формулу в структуре и сохраняет результаты в dd$result.

x <- runif(60, min = 2, max = 35)
y <- runif(60, min = 0, max = 10)
z <- runif(60, min = 5, max = 20)
struct1 <- rep("x + y + z", times = 20)
struct2 <- rep("x - y - z", times = 20)
struct3 <- rep("x * y * z", times = 20)
struct <- c(struct1, struct2, struct3)
dd <- data.frame(x, y, z, struct, stringsAsFactors = FALSE)
rm(x, y, z, struct, struct1, struct2, struct3)

dd$result <- sapply(1:nrow(dd), function(i) with(dd[i,], eval(parse(text = struct))))
1
Consistency 28 Май 2017 в 23:14