【发布时间】:2017-07-02 21:58:46
【问题描述】:
我有一个包含许多值和计算的 data.frame。其中一个值是风速。我所做的是从变化的风速中计算出不同的能量。我手动完成并逐行构建数据框,如下所示:
zz <- as.data.frame(matrix(seq(100),nrow=5,ncol=3))
zz$V1 <- c("v_in (m/s)","density p (kg/m^3)","Cd ()", "d_rotor (m)",
"A_rotor (m^2)")
zz$V2 <- c("2", # wind_speed
"1.2", # density
"0.00482", # Cd
"112", # d_rotor
"")
zz$V3[1] <- "" # v_in
zz$V3[2] <- "" # density
zz$V3[3] <- "" # Cd
zz$V3[4] <- "" # d_rotor
zz$V3[5] <- as.numeric(pi/4*(as.numeric(zz[4,2]))^2) # A_rotor
这只是我的data.frame的摘录,但我希望你能看到我的意图。 我现在想要的是创建始终具有更改参数的相同数据框,例如风速(比如说 3 和 4 m/s)。 同时更改多个值也很酷(假设风速 5 和密度 1 或风速 6 和密度 2)。 我试图用一个函数来解决这个问题,但它没有用。它只给了我一个值,而不是完整的数据框。
speed_vector <- c("w_sp_3" = 3, "w_sp_4" = 4)
make_speed <- function(x)
{
zz <- as.data.frame(matrix(seq(100),nrow=5,ncol=3))
zz$V1 <- c("v_in (m/s)","density p (kg/m^3)","Cd ()", "d_rotor (m)",
"A_rotor (m^2)")
zz$V2 <- c("speed_vector[x]", # v_in
"1.2", # density
"0.00482", # Cd
"112", # d_rotor
"")
zz$V3[1] <- "" # v_in
zz$V3[2] <- "" # density
zz$V3[3] <- "" # Cd
zz$V3[4] <- "" # d_rotor
zz$V3[5] <- as.numeric(pi/4*(as.numeric(zz[4,2]))^2) # A_rotor
}
w_speed_3 <- make_speed("w_sp_3")
w_speed_4 <- make_speed("w_sp_4")
这是修改后的新代码:
speed_vector <- c("w_sp_3" = 3, "w_sp_4" = 4)
make_speed <- function(x)
{
V1 <- c("v (m/s)","density (kg/m^3)","Cd ()", "d (m)", "A (m^2)", "N/(W*L)",
"length L (km)", "Width W (km)", "Height H (m)", "coefficient ()",
"N ()", "J_h (GW)", "J_v (GW)", "f_red ()", "v (m/s)", "J_out (GW)")
V2 <- c(speed_vector[x], # v
"1.2", # density
"0.00482", # Cd
"112", # d
"",
"4.1", # MW/km^2
"", "",
"700", # Height
"0.44", # coefficient
"", "", "", "", "", "")
V3 <- c(rep("",4),
as.numeric(pi/4*(as.numeric(V2[4]))^2),
rep("",1),
as.numeric((16172.5*0.0898)^(1/2)),
as.numeric((16172.5*0.0898)^(1/2)),
rep("",2),
as.numeric(16172.5*0.0898*as.numeric(V2[4])/3.075),
as.numeric(as.numeric(V2[2])/2*as.numeric(V3[8])*1000*as.numeric(V2[9])*
(as.numeric(V2[1])^3)/10^9),
as.numeric((as.numeric(V2[2])*as.numeric(V2[3])*as.numeric(V3[8])*1000*
as.numeric(V3[7])*1000*(as.numeric(V2[1])^3))/10^9),
as.numeric(as.numeric(V2[9])+2*as.numeric(V2[3])*as.numeric(V3[7])*1000)/
((as.numeric(V2[9])+2*as.numeric(V2[3])*as.numeric(V3[7])*1000)+3/2*
as.numeric(V3[11])/(as.numeric(V3[8])*1000)*as.numeric(V2[10])*
as.numeric(V3[5])),
as.numeric(as.numeric(V3[14])^(1/3)*as.numeric(V2[1])),
as.numeric(as.numeric(V2[2])/2*(as.numeric(V3[8])*1000)*as.numeric(V2[9])*
as.numeric(V3[15])^3/10^9))
zz <- data.frame(V1,V2,V3)
return(zz)
}
w_speed_3 <- make_speed("w_sp_3")
w_speed_4 <- make_speed("w_sp_4")
一个更简单的例子:
speed_vector <- c("w_sp_3" = 3, "w_sp_4" = 4)
make_speed <- function(x)
{
V1 <- c("v (m/s)","density (kg/m^3)","Cd ()", "d (m)", "A (m^2)", "N/(W*L)",
"V(m/s)")
V2 <- c(speed_vector[x], # v
"1", # density
"2", # Cd
"3", # d
"4", # MW/km^2
"5", # Height
"6" # coefficient
)
V3 <- c(as.numeric(as.numeric(V2[4]) ^ 2),
as.numeric(as.numeric(V2[1]) + as.numeric(V2[2])),
as.numeric(as.numeric(V2[1]) * as.numeric(V2[2])),
as.numeric(as.numeric(V2[1]) + as.numeric(V2[2]) + as.numeric(V2[3])),
as.numeric(as.numeric(V2[2]) + as.numeric(V3[2])),
as.numeric(as.numeric(V3[1]) + as.numeric(V3[2])))
zz <- data.frame(V1,V2,V3)
return(zz)
}
w_speed_3 <- make_speed("w_sp_3")
w_speed_4 <- make_speed("w_sp_4")
【问题讨论】:
-
psych包有一个非常有用的read.clipboard()函数,您可以使用它直接从电子表格中复制data.frame。 -
我没有检查你所有的代码,但在函数结束时你应该使用
return(zz)。如果您不这样做,该函数将返回最后一个计算值,在您的情况下为zz$V3[5] -
好吧,没用,那里有很多乱七八糟的东西:),我会努力解决的