【问题标题】:Creating a loop with dnorm and adding result to a table使用 dnorm 创建循环并将结果添加到表中
【发布时间】:2020-03-02 22:32:11
【问题描述】:

我有一个包含 1000 行的表,其中每一行都是一个不同的变量。每行包括一个名称、值、平均值和标准差。

Table_1 <- data.table(Variables = c("a","b","c"), Value = 1000, mean = -(3:1), sd   = 2)

我的桌子是这样的:

Variables Value  mean sd
a         1000   -3   2
b         1000   -2   2
c         1000   -1   2
...

对于每一行我想添加以下结果:

set.seed(1)
sq1 <- seq(from = -3, to = 3, length.out = 180)
rn1 <- dnorm(sq1, mean = Table_1$mean[1], sd = Table_1$sd[1])
rn2 <- Table_1$Value[1] * rn1/sum(rn1)

我尝试了一个循环,但我的 rn1 部分有问题,甚至无法进入 rn2 部分。下面的循环给了我NULL。

Table_2 <- for(i in 1:3) {dnorm(sq1, mean = Table_1$mean[i], sd = Table_1$sd[i])}

结果应该是这样的,但输出也可以是单独的表格或长格式:

Variables Value  mean sd 1          2          3          ...
a         1000   -3   2  13.3182941 13.3164238 13.3108143 ...
b         1000   -2   2  8.5720647  8.6429855  8.7120456  ...
c         1000   -1   2  4.939155   5.021927   5.104651   ...

您知道如何将其放入循环或应用函数或映射函数吗?

【问题讨论】:

    标签: r dataframe for-loop lapply


    【解决方案1】:

    在这种情况下,我建议不要使用循环。 一种选择是lapply:

    my_fun <- function(value, mean, sd) {
      rn1 <- dnorm(seq(from = -3, to = 3, length.out = 180), mean, sd)
      return(value * rn1 / sum(rn1))
    }
    
    lapply(1:3, function(i) my_fun(Table_1$Value[i], Table_1$mean[i], Table_1$sd[-1]))
    

    另一种解决方案是使用tidyverse 包:

    library(tidyverse)
    
    set.seed(1)
    new_data <- tibble(Variables = c("a","b","c"), value = 1000,
                       mean = (-3):(-1), sd = 2) %>%
      mutate(result = pmap(list(value, mean, sd), my_fun))
    
    # A tibble: 3 x 5
      Variables value  mean    sd result     
      <chr>     <dbl> <int> <dbl> <list>     
    1 a          1000    -3     2 <dbl [180]>
    2 b          1000    -2     2 <dbl [180]>
    3 c          1000    -1     2 <dbl [180]>
    

    在最后一个示例中,为每一行创建了一个包含值的新列结果。要访问这些值,您可以使用new_data$result[[1]]

    【讨论】:

    • 感谢您的快速回复,我已经测试了两种解决方案,第二个对我来说效果更好。还要感谢您对我的问题进行的编辑,我会在以后注意这些错误。
    猜你喜欢
    • 1970-01-01
    • 2019-09-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-12
    • 2016-01-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多