【问题标题】:R extend vectors to be the same length around central valueR 将向量扩展为围绕中心值的相同长度
【发布时间】:2018-05-14 14:03:53
【问题描述】:

假设我有一个列表:

[[1]]
 [1]  0.7125856 -1.4871811  0.6230076  1.0756424  0.8172592 -0.1327926 -0.7674947 -1.0738684  1.5706677
[10] -0.6674960

[[2]]
[1] -0.5778682 -1.1186447  0.8272505  0.5123162  0.6607654  1.6559877 -0.7961859 -0.8966686

[[3]]
 [1] -1.42867999 -0.21142100 -2.89762370  0.11036288  0.66846399 -0.77309213  0.35278541 -0.99579117 -0.73043142
[10] -0.01857864 -0.93654969  0.46751328

[[4]]
[1] -0.483896685 -0.207550362 -0.902920637 -0.008191134 -1.015636093

而且我还有一个向量,其中包含此列表中向量的所谓“中心”值的索引:

[1] 2 4 5 1

我想要得到的是对于给定的范围(例如,3),获取围绕这些中心的向量子集,并在两边都有范围的长度。因此,每个子集的长度必须为 7,如果范围超出向量的长度,则必须添加 NA:

[[1]]
[1]         NA         NA  0.7125856 [-1.4871811]  0.6230076  1.0756424  0.8172592

[[2]]
[1] -0.5778682 -1.1186447  0.8272505  [0.5123162]  0.6607654  1.6559877 -0.7961859

[[3]]
[1] -0.2114210 -2.8976237  0.1103629  [0.6684640] -0.7730921  0.3527854 -0.9957912

[[4]]
[1]           NA           NA           NA [-0.483896685] -0.207550362 -0.902920637 -0.008191134

我将中心放在括号中,因为 SO 不允许在代码中使用粗体文本。有没有办法在 R 中做这样的事情?

【问题讨论】:

    标签: r


    【解决方案1】:

    我想你正在寻找这样的东西?

    数据:

    n <- 10
    x <- list(rnorm(n),rnorm(n),rnorm(n),rnorm(n))
    i <- c(2,4,5,1)
    r <- 3
    

    可能的解决方案:

    f <- function(x) ifelse((x-r):(x+r) %in% 1:n,(x-r):(x+r),NA)
    tmp <- lapply(i,f)
    out <- mapply("[",x,tmp)
    split(out,col(out))
    $`1`
    [1]         NA         NA  0.8120232  0.4980624 -2.9708413  0.6754918 -0.9900322
    
    $`2`
    [1] -1.0303741 -1.7432638  0.9466315 -1.3322712 -1.7281613 -0.1951453  0.3789493
    
    $`3`
    [1] -1.4120119  0.3675425 -0.8378275 -1.1080856 -0.9369994  1.0823376  1.2194782
    
    $`4`
    [1]         NA         NA         NA  0.1757164 -1.5768032  0.3121876  0.4443616
    

    【讨论】:

    • 谢谢,但是列表中的向量长度不同,我想均衡它们会有问题
    • 所以它似乎有效,但我是否正确理解 n 实际上并不是很有意义?我使用不同的 n 得到相同的结果
    • 正确。由于您没有发布可重现的示例(下次使用 dput() 函数并发布输出)我生成了一个随机向量列表,长度 = n。我可能应该改变 n 以更好地匹配您的数据,但正如您所说,它仍然可以工作。
    猜你喜欢
    • 2022-06-17
    • 2015-10-02
    • 1970-01-01
    • 2012-06-03
    • 1970-01-01
    • 1970-01-01
    • 2018-08-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多