【问题标题】:Loop over dataframe rows and write functions with unknown parameters循环数据帧行并使用未知参数编写函数
【发布时间】:2020-03-13 15:02:26
【问题描述】:

我有一个如下所示的数据框。

Index_1 Index_2 Constant Outcome
   1      3        5        1
   2      3        6        0
   1      4        7        1

我需要为数据框中的每一行编写一个方程。这些方程最终将相乘以定义似然函数。我想创建一个看起来像这样的东西:

Index_1 Index_2 Constant Outcome Equation
   1      3        5        1      m_1 - m_3 + 5 + e_1
   2      3        6        0      m_2 - m_3 + 6 + e_2
   1      4        7        1      m_1 - m_4 + 7 + e_3

我可以使用此代码让 R 打印出我需要的方程式:

for (row in 1:nrow(data)) {
  mu_a <- (paste("m_",data$Index_1[row],sep=""))
  mu_b <- (paste("m_",data$Index_2[row],sep=""))
  e_it <- (paste("e_", row,sep=""))
  print(paste(mu_a, paste("-",paste(mu_b,paste("+",paste(tradeoffs$d_lnxy[row], paste("+", e_it), sep = " "), sep = " "), sep = " "), sep = " "), sep = " "))
}

但是,它很麻烦,我希望每个 m_j 和 e_t 都是一个对象,因为这些是最大似然估计的参数。我想我需要使用 apply,但我正在努力编写我需要的函数。

【问题讨论】:

    标签: r dataframe apply


    【解决方案1】:

    先添加一个这样的索引怎么样:

    data$Index <- row.names(data)
    

    然后像这样创建一个粘贴的方程:

    data$Equation <- with(data,paste0("m_", Index_1, " - m_", Index_2, " + ", Constant, " + e_", Index))
    

    你的结果:

     Index_1 Index_2 Constant Outcome Index Equation           
        <dbl>   <dbl>    <dbl>   <dbl> <chr> <chr>              
    1       1       3        5       1 1     m_1 - m_3 + 5 + e_1
    2       2       3        6       0 2     m_2 - m_3 + 6 + e_2
    3       1       4        7       1 3     m_1 - m_4 + 7 + e_3
    

    如果您需要分别引用方程式中的每一项,您可以使用上面的 paste0() 函数创建任意数量的附加列。即,您可以创建一个名为“mu_a”的列,然后执行 paste0("m_", data$Index1)。然后,您可以使用此列和其他列(每列代表方程中的一个项)执行矢量化操作。

    【讨论】:

    • 谢谢!这真的很有帮助。一个后续问题:将方程式作为字符会产生问题吗? (即如何将它们相乘并让 R 将 m 和 e 视为变量,而不仅仅是字符)
    • 例如,当我使用data$likelihood_t &lt;- pnorm(data$Equation)^(data$choice)+(1-pnorm(data$Equation))^(1-data$choice) 写观察级似然时,我得到这个错误:Error in pnorm(data$model) : Non-numeric argument to mathematical function
    • 我会在一分钟内调整答案。上面示例中的数据框名称是“权衡”吗?
    • 是的,但是我已经编辑了我的评论,所以我使用“数据”作为我的数据框的名称。
    • 您不能像使用“pnorm(data$Equation)”那样将字符串提供给“pnorm”之类的调用。 R不知道如何计算。相反,您需要输入实际数字。 “数据”数据框中的列是否被另一个数据框/数据集中的其他值替换?
    【解决方案2】:

    不需要循环。您可以将变量粘贴在一起,即

    paste0('m_', df1$Index_1, ' - m_', df1$Index_2, ' + ', df1$Constant, ' + e_', seq(nrow(df1)))
    #[1] "m_1 - m_3 + 5 + e_1" "m_2 - m_3 + 6 + e_2" "m_1 - m_4 + 7 + e_3"
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-15
      • 1970-01-01
      • 2020-07-12
      • 2011-09-24
      • 2012-07-21
      • 2017-03-21
      相关资源
      最近更新 更多