【问题标题】:Create new column based on another column from dataframe with rnorm function使用 rnorm 函数基于数据框中的另一列创建新列
【发布时间】:2021-01-19 16:29:32
【问题描述】:

我正在尝试在 rnorm 函数中使用列值并创建新的列绑定数据框。

> show(tablo)
      teta
1 14.67078
2 14.86293
3 15.54010
4 15.91335
5 16.05241
6 15.24349
7 15.01060
8 14.79570

每个 teta 值均指 rnorm 函数中的值。首先我创建了函数

values <- function(x)
{
rnorm(1, x, 0.55)
}
values(tablo$teta) or attach(tablo) values(teta)

这个函数只显示一个值。

这很奇怪。

a <- 1:10

test <- function(x) {
    x +20
}

test(a)

此函数显示 a 的所有新 a 值。

【问题讨论】:

    标签: r function


    【解决方案1】:

    您应该在rnorm 中使用length(x) 而不是1,例如,

    rnorm(length(x),x,0.55)
    

    【讨论】:

    • 我正在尝试从具有特定平均值的正态分布中抽取一个样本。
    • @pirekare 在这里,您将获得length(x) 具有由x 指定的多个均值的正态随机变量,即不同的均值。
    • test2 &lt;- function(x){ rnorm(length(x), x, 0.55) } >teta 16.99719 17.43694 17.77940 17.74896 18.45911 17.96390 17.75676 16.85919 test2(不工作。 @SK sapply 解决方案是我正在寻找的。​​span>
    【解决方案2】:

    使用 apply 系列函数(例如 sapply)函数,因为您想在向量的每个元素上使用函数 values。以下应该做的工作:

    sapply(tablo$teta,values)
    #[1] 14.88455 14.07981 15.19649 16.12940 16.42719 14.69165 14.27466 13.57540
    

    您的test 函数在不使用sapply 的情况下工作,因为R 中的+ 操作是向量操作。但是,它不适用于values 函数,因为在rnorm 中,如果 n(第一个参数)为 1,则平均值(即第二个参数)应作为标量传递(而在您的问题中将其作为向量传递) .

    【讨论】:

    • Well values 函数只是显示我想做什么。我找到了这个解决方案code tablo2 code 你的解决方案更干净。任何原因测试功能有效但值功能无效?
    • 是的,循环会起作用,但如果您在大型数据集上运行,它往往会更慢。在大型数据集上使用如上所示的 sapply 会更快。
    猜你喜欢
    • 2020-10-11
    • 1970-01-01
    • 1970-01-01
    • 2022-01-14
    • 1970-01-01
    • 1970-01-01
    • 2018-02-14
    • 1970-01-01
    • 2016-06-15
    相关资源
    最近更新 更多