【问题标题】:How to build a data frame where one column adds onto the other in R如何构建一个数据框,其中一列添加到 R 中的另一列
【发布时间】:2021-05-11 18:55:10
【问题描述】:

我想在 R 中创建一个随机数据框,其中第二列的值 = 第一列 + 数字,第一列的下一个值 = 第二列 + 数字

看起来像这样:

我试过这样做:

Sal = rnorm(150,mean=18,sd=1.7)
H2O = Sal + 0.2358
d = data.frame(Sal = rep(Sal,1), H2O = rep(H2O,1))
df = d[order(d$Sal,d$H2O),]
df

但它并没有真正起作用,因为下一个数字不会“建立”在前一个数字的基础上。

我怎么能这样做?我应该使用循环吗?我的 R 经验相当有限(您可能知道)

提前谢谢你!

【问题讨论】:

  • 随机性应该来自哪里?如果number = 0.2358 为常数,则所有其他值均由起始值确定。
  • @IanCampbell 随机性来自第 1 列和第 2 列的值(将是盐和 H2O)如果数字(0.2358)也可以是随机数(间隔为 0.100 到0.350),但我还不知道该怎么做
  • 但是在你的例子中,14.231 看起来是随机的,但 14.872 不是随机的,它是14.231 + 2*number。你的代码说你想从 150 个随机值开始,但你的解释说你想从 1 个随机值开始并从中构建 150 个值。
  • @GregorThomas 是的,就是这样! :) 我用于表格的数字只是作为示例(我没有在它们上面添加 0.2358,我只是为示例发明了随机数)。很抱歉造成混乱!
  • 假设Sal = rnorm(1, mean=18, sd=1.7) 和Const <- 0.2358 这是你想要的吗? Table <- matrix(Sal + 0:149 * Const, 75, 2, byrow=TRUE)

标签: r dataframe random


【解决方案1】:

我认为cumsum 是您正在寻找的(然后填充数据框的行):

set.seed(42)
n_rows <- 5
rnd_numbers <- rnorm(n_rows * 2, mean = 18, sd = 17)
entries <- cumsum(rnd_numbers)
df <- data.frame(matrix(entries, nrow = n_rows, byrow = T))
colnames(df) <- c('Sal', 'H20')
df

        Sal       H20
1  41.30629  49.70642
2  73.87961 102.63827
3 127.51083 143.70672
4 187.40259 203.79339
5 256.10659 273.04045

您可以通过查看底层随机数来检查结果是否符合上述结构:

rnd_numbers
[1] 41.306294  8.400131 24.173183 28.758664 24.872561 16.195883
[7] 43.695874 16.390796 52.313203 16.933860

【讨论】:

    【解决方案2】:

    对于您的问题,查看所需的输出 data.frame,如果您关注从左到右和从上到下的值,您将看到相对于第一个值的增量,因为参考可以是写成

    c(0,1,2,3,....,2*nr-1)*number
    

    其中nr 是所需输出的行数。在此之后,您唯一需要做的就是创建序列作为增量并将它们添加到初始值。


    你可以试试下面的代码

    set.seed(1)
    Sal <- rnorm(1, mean = 18, sd = 1.7)
    number <- 0.2358
    nr <- 10
    df <- setNames(
      data.frame(
        matrix(Sal + (seq(2 * nr) - 1) * number,
          ncol = 2,
          byrow = TRUE
        )
      ),
      c("Sal", "H2O")
    )
    

    给了

    > df
            Sal      H2O
    1  16.93503 17.17083
    2  17.40663 17.64243
    3  17.87823 18.11403
    4  18.34983 18.58563
    5  18.82143 19.05723
    6  19.29303 19.52883
    7  19.76463 20.00043
    8  20.23623 20.47203
    9  20.70783 20.94363
    10 21.17943 21.41523
    

    【讨论】:

      【解决方案3】:

      这是一种使用Reduce的方法:

      set.seed(123)
      Start <- rnorm(1,14,1)
      Values <- Reduce(`+`,rnorm(19, 0.25, 0.125),init = Start, accumulate = TRUE)
      Matrix <- matrix(Values, ncol = 2, byrow = TRUE)
      Result <- setNames(as.data.frame(Matrix),c("Salt","H2O"))
      Result       
             Salt      H2O
      1  13.43952 13.66075
      2  14.10559 14.36440
      3  14.63057 15.09495
      4  15.40256 15.49443
      5  15.65857 15.85287
      6  16.25588 16.55085
      7  16.85095 17.11478
      8  17.29530 17.76867
      9  18.08090 18.08507
      10 18.42274 18.61364
      

      Reduce 的第一个参数是一个有两个参数的函数,在我们的例子中是 +。我们将init =设置为起始值,然后加上rnorm生成的随机值。该新值用作下一个数字的起始值。我们使用accumulate = TRUE 来保留所有值。

      从这里,我们可以使用matrix(),将值向量更改为2 x n 矩阵。然后我们可以转换为data.frame并添加列名。

      【讨论】:

      • 伊恩就是这样!太感谢了! :) 我也很欣赏代码的简要说明!
      • 你能种个种子吗
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-02-03
      • 2015-06-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多