【问题标题】:Vectors in R, using the components in two vectors to create a new vectorR中的向量,使用两个向量中的分量来创建一个新向量
【发布时间】:2020-02-08 23:57:08
【问题描述】:

所以我有一个向量代表开始时间 (trt.start) 和结束时间 (trt.end)。每个开始时间代表一次治疗(需要400天),向量trt.end中的对应位置代表结束。

trt.start = c(10000,10090,10180,10270, 10360) 
trt.end = c(trt.start + 400)

有没有办法(无需硬编码)创建一个新的向量来代表每次治疗的持续时间?所以它会导致:

c(10000:10400, 10090:10490, 10180:10580, 10270:10670, 10360:10760)

我希望无需硬编码就能做到这一点,因为trt.start 向量会改变值。

谢谢!

【问题讨论】:

    标签: r vector


    【解决方案1】:

    R中,我们可以使用Map得到list中对应向量的序列,然后unlistlist创建单个vector

    v1 <- unlist(Map(`:`, trt.start, trt.end))
    length(v1)
    #[1] 2005
    

    如果我们需要string

    v1 <- sprintf("%d:%d", trt.start, trt.end)
    v1
    #[1] "10000:10400" "10090:10490" "10180:10580" "10270:10670" "10360:10760"
    

    paste

    v1 <- paste0(trt.start, ":", trt.end)
    v1  
    #[1] "10000:10400" "10090:10490" "10180:10580" "10270:10670" "10360:10760"
    

    或者矢量化选项是replicate 'trt.start',然后添加值序列

    v2 <- rep(trt.start, each = 401) + seq_len(401) -1
    all.equal(v2, v1)
    #[1] TRUE
    

    【讨论】:

    • @jrokh 你需要一个字符串"10000:10400",因为那不是数字
    • 问题是我需要将结果向量保持在格式中,因此每次处理都是这样的段:(10000:10400, 10090:10490, 10180:10580, 10270:10670, 10360:10760)。然后我的意图是使用该向量在列中的子集部分中指示,例如 `df$column[c((10000:10400, 10090:10490, 10180:10580, 10270:10670, 10360:10760)]。跨度>
    • @jrokh 如果是子集,为什么不直接使用v1 我首先展示了v1 &lt;- unlist(Map(:, trt.start, trt.end)) 它完全符合您的要求
    • 当我使用 v1 &lt;- unlist(Map(:, trt.start, trt.end)) 时,结果似乎是来自 [1:2005]'. The result of v1
    • @jrokh 举个例子df1 &lt;- data.frame(col1 = rnorm(20), col2 = runif(10)); v1 &lt;- unlist(Map(":", c(3, 8, 17), c(5, 11, 20))); df1[v1, ] 给出行的子集或提取列df1$col1[v1]
    猜你喜欢
    • 2022-06-28
    • 1970-01-01
    • 2019-10-06
    • 1970-01-01
    • 2020-11-12
    • 1970-01-01
    • 1970-01-01
    • 2016-05-09
    • 1970-01-01
    相关资源
    最近更新 更多