【问题标题】:Split a vector in R depending on entries根据条目拆分 R 中的向量
【发布时间】:2018-04-02 01:56:15
【问题描述】:

我输入了一个向量 vec<-c(2 3 4 8 10 12 15 19 20 23 27 28 39 47 52 60 64 75),以及我想将向量条目分成的区间大小。

在此示例中,我想根据每个条目的大小将其分解为 9 个不同的向量。 在我的情况下,我希望向量 1 成为区间 [1,9] 中的条目,然后向量 2 成为 [10,18] 中的条目...等

换句话说:

vec1: 2 3 4 8
vec2: 10 12 15
vec3: 19 20 23 27

等等……

我尝试过使用拆分功能,但我不知道如何设置一个可行的比率。

【问题讨论】:

  • ... 基于每个条目的大小 - 这是什么意思?请进一步解释您如何从vec 获得输出。
  • 我建议使用整数除法来确定每个向量属于哪个向量 %/% 是运算符。
  • 当然,我想输入一个向量和一个区间大小,输出将是一些向量,其中的条目在这些递增的区间中。在上面的例子中,我选择了 [1,9], [10,18],...
  • @Gregor 关闭,但您的输出与 OP 不匹配。我想你想要这个split(vec,vec %/%9)
  • 感谢您澄清我的问题。 @Mako212 这个答案很好用,谢谢

标签: r vector split


【解决方案1】:

也许下面会做你想要的。

f <- cut(vec, seq(0, max(vec), by = 9), include.lowest = TRUE)
sp <- split(vec, f)
sp <- sp[sapply(sp, function(x) length(x) != 0)]
sp

【讨论】:

    【解决方案2】:

    使用整数除法%/% 返回每​​个值所属组的向量。然后将split 分成单独的向量。使用 (vec-1) 表示“包容性”,即 27 与第 3 组一起使用,而不是第 4 组。

    split(vec,(vec-1) %/% 9)
    

    编辑:

    使用dplyr 和cut 的另一种方式,它们显式标记每个间隔

    require(dplyr)
    
    vec <- as.data.frame(vec)
    
    df2 %>% mutate(interval = cut(vec,breaks=seq(0,((max(vec) %/% 9) +1) * 9,9),include.lowest=TRUE,right=TRUE))
    
       vec interval
    1    2    [0,9]
    2    3    [0,9]
    3    4    [0,9]
    4    8    [0,9]
    5   10   (9,18]
    6   12   (9,18]
    7   15   (9,18]
    8   19  (18,27]
    9   20  (18,27]
    10  23  (18,27]
    11  27  (18,27]
    

    【讨论】:

    • 我认为应该是split(vec,(vec -1)%/% 9),因为在我的情况下,我的第一个间隔从 1 而不是 0 开始
    • @user7512228 是的,已修复。我错过了 27 日的“包容性”。
    【解决方案3】:

    也许是这样

    library(purrr)
    vec <- c(2,  3,  4,  8, 10 ,12, 15 ,19, 20, 23, 27, 28, 39, 47, 52, 60, 64, 75)
    
    vec1 <- keep(vec, function(x) x >= 1 & (x) <= 9)
    vec2 <- keep(vec, function(x) x >= 10 & (x) <= 18)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-01
      • 1970-01-01
      • 2020-12-23
      • 1970-01-01
      • 1970-01-01
      • 2018-08-09
      相关资源
      最近更新 更多