【问题标题】:create a data frame with a function使用函数创建数据框
【发布时间】: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]
  • 好吧,没用,那里有很多乱七八糟的东西:),我会努力解决的

标签: r dataframe


【解决方案1】:

我清理了一下,如果你想要的话,请告诉我:

speed_vector <- c("w_sp_3" = 3, "w_sp_4" = 4)

make_speed <- function(x)  
{
 V1 <- c("v_in (m/s)","density p (kg/m^3)","Cd ()", "d_rotor (m)", 
             "A_rotor (m^2)")

 V2 <- c(speed_vector[x],  # v_in # it was a string in your question, but it's the only place where x was used so I figured you wanted it as a value
             "1.2",      # density
             "0.00482", # Cd
             "112",     # d_rotor
             "")
  V3 <- c(rep("",4),as.numeric(pi/4*(as.numeric(V2[4]))^2))
  zz <- data.frame(V1,V2,V3) # better to build the data.frame this way than starting with an empty one, and also yours was generating warnings because of number of element not consistent with rows and cols
  return(zz) # the important line that you were missing
}

w_speed_3 <- make_speed("w_sp_3")
w_speed_4 <- make_speed("w_sp_4")

编辑为您的后续问题

您现在遇到的问题完全不同。

您可能想了解函数debugoncedebug

通过运行:

debugonce(speed)
w_speed_3 <- make_speed("w_sp_3")

我看到错误在该行中:

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))

仔细看,我看到你在调用 V3 来定义 V3,但是 V3 不存在,所以函数停止并出现错误。

我不知道您要做什么,但是您不能在右侧使用自身启动变量。

【讨论】:

  • 您仍然将一些数字存储为字符串,并将行名放在列中,这可能不是您应该这样做的方式。但我尽可能接近你的问题。
  • 您可能想查看@ddunn801 的答案,但是您不需要data.frame,您可以使用列表,而且您根本不需要函数
  • 非常感谢您的回答,Moody_Mudskipper!复制代码并添加更多行和计算后,我收到错误“找不到对象'V3'”。我认为在创建 V3 之前,我添加了一些计算。你知道如何解决这个问题吗?如果有帮助,我也可以编辑问题并输入新代码。
  • 你应该 :),因为有了这些信息我什么也不能告诉你
  • 你有什么想法吗?
【解决方案2】:

编辑:更新了两个选项的后续请求。

考虑这种方法;将参数存储在列中更习惯:

speed_racer <- function(v_in = NULL, density = NULL, Cd = NULL, d_rotor = NULL) {
  scenario <<- data.frame(v_in = c("(m/s)", v_in), density = c("(kg/m^3)", density), 
                          Cd = c("()", Cd), d_rotor = c("(m)", d_rotor), 
                          A_rotor = c("(m^2)", as.numeric(pi/4*(as.numeric(d_rotor)^2))))
}

speed_racer(v_in = 2.0, density = 1.2, Cd = 0.00482, d_rotor = 112.0)

.

speed_racer <- function(v_in = NULL, density = NULL, Cd = NULL, d_rotor = NULL) {
  scenario <<- data.frame(v_in = paste(v_in, "m/s"), density = paste(density, "kg/m^3"), 
                          Cd = Cd, d_rotor = paste(d_rotor, "m"), 
                          A_rotor = paste(as.numeric(pi/4*(as.numeric(d_rotor)^2)), "m^2"))
}

speed_racer(v_in = 2.0, density = 1.2, Cd = 0.00482, d_rotor = 112.0)

【讨论】:

  • 非常感谢您的回答,ddunn801。有没有办法添加单位符号(例如 m/s、m、...)?
  • 作为数据框中的另一行,还是实际上在每个数字的末尾?无论哪种方式都是可行的。
  • 那么这两种方法,请:)
  • 按行存储参数不是一个好方法吗?我这样做是因为那时我对单位符号(第一列)、给定参数(第二列)和计算参数(第三列)有了一个很好的了解。
  • 我的 2 美分:我认为在列中显示参数很好,但在行中存储它们很好(大多数数据库的方式)。考虑存储潜在数以千计的行的最佳方式,然后分别考虑如何对这些行提出问题并显示结果。
猜你喜欢
  • 2020-10-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-11
  • 2021-02-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多