【问题标题】:Sample Random Column for Each Row in Data.FrameData.Frame 中每一行的样本随机列
【发布时间】:2018-11-01 04:01:57
【问题描述】:

我有一个data.frame,它具有abc 的时间序列值。我想构建一个随机时间序列,随机选择每一行的列值(即日期)。

例如,如果我们有以下df

df <- data.frame(date = c(as.Date("2018-08-01"),as.Date("2018-09-01"), as.Date("2018-10-01")), a = c(1.0, 1.5, 1.8), b=c(-1.0, -2.0, 3.0), c=c(-2.0, -15.0, 1.7))

 #> df
 #           date   a  b     c
 #   1 2018-08-01 1.0 -1  -2.0
 #   2 2018-09-01 1.5 -2 -15.0
 #   3 2018-10-01 1.8  3   1.7

一个可能的随机样本看起来像(在这种情况下,第一个月选择a,第二个月选择b,第三个月选择c)。

df.random.sample <- data.frame(date = c(as.Date("2018-08-01"),as.Date("2018-09-01"), as.Date("2018-10-01")), random = c(1.0, -2.0, 1.7))

#> df.random.sample
#        date random
#1 2018-08-01    1.0
#2 2018-09-01   -2.0
#3 2018-10-01    1.7

最重要的是,我有许多不同的列,因此希望它可以与列索引一起使用,因此我不需要指定每个列名。

【问题讨论】:

    标签: r dataframe


    【解决方案1】:

    如果我们想逐行采样,那么使用apply

    cbind(df[1], random = apply(df[-1], 1, sample, size = 1))
    

    或者使用row/column 索引的矢量化方法

    cbind(df[1], random = df[-1][cbind(seq_len(nrow(df)), sample(2:ncol(df))-1)])
    

    【讨论】:

    • 当我尝试使用格式完全相同但列数与行数不匹配的 data.frame 时,我收到了 Error in data.frame(..., check.names = FALSE) : arguments imply differing number of rows
    • @cpage 你试过apply的第二种解决方案吗
    • @arkun 似乎有效,第一个和第二个有什么区别。具体来说,“if it is by row”指的是什么?
    • @cpage 因为数据是对称的(关于行数和列数(如果我们删除“日期”),我想我们需要得到@987654327 @ 每列的长度。但是在阅读问题时,有人提到您需要为每一行选择一个列值。从 'a'、'b' 或 'c' 这就是你想要的
    猜你喜欢
    • 1970-01-01
    • 2015-10-19
    • 2021-06-28
    • 2013-11-28
    • 1970-01-01
    • 2020-12-27
    • 2011-09-05
    • 1970-01-01
    • 2019-08-17
    相关资源
    最近更新 更多