【问题标题】:R looping through vector with ifelseR用ifelse遍历向量
【发布时间】:2020-08-21 17:10:21
【问题描述】:

我希望 ifelse 循环遍历向量,如果条件为真(值 = 2 或 3),我想对一个集合进行采样,如果不将值设置为零。此代码有效,但似乎只进行一次采样,并且回收了相同的值。是否可以让它对数组的每个值执行采样?

vec1 <- sample(1:7, 5, replace = TRUE)

vec2 <- ifelse (vec1 == 2 | vec1 == 3,
                sample(0:3, 1),
                0
                )
vec2
[1] 3 3 0 0 3

它有效,但我希望 vec2 位置 1,2 和 5 有不同的值,而不是每次都发生相同的值。所以我希望看到随机抽样,最终得到 ​​p>

vec2 [1] 1 3 0 0 3

vec2 [1] 1 2 0 0 3

我的逻辑和/或代码中缺少某些内容。 谢谢,J

【问题讨论】:

  • 我认为您不是在“循环”向量,而是在比较整个向量。

标签: r loops if-statement sample


【解决方案1】:

您的sample(0:3, 1) 就像您的0 一样被“回收”......它不会在每次需要时都重新运行。您需要预先生成所有替换项,以便在需要时使用它们。这样做:

ifelse(vec1 %in% c(2, 3), sample(0:3, size = length(vec1), replace = TRUE), 0)

比起vec1 == 2 | vec1 == 3,我也更喜欢vec1 %in% c(2, 3),因为它可以更好地扩展...如果您有超过2 种可能性,%in% 很容易添加,但== | == | == 很快就会变老。

或者,如果您关心速度/效率,这会更快:

to_replace = which(vec1 %in% c(2, 3))
vec1[to_replace] = sample(0:3, size = length(to_replace), replace = TRUE)

【讨论】:

    【解决方案2】:

    试试这个。

    vec2 <- sapply(vec1, function(x) ifelse(x == 2 | x == 3, sample(0:3, 1), 0))
    

    【讨论】:

    • 谢谢,很好的答案。顺便说一句,这有点令人困惑,因为您到处阅读有关 ifelse 是 if 的矢量化版本的信息,但实际上它的行为并非如此吗?
    【解决方案3】:

    这允许您检查向量中的每个项目:

    vec1 <- sample(1:7, 5, replace = TRUE)
    
    my_fn <- function(x) ifelse(x == 2 | x ==3, sample(0:3, 1), 0)
    
    vec2 <- lapply(vec1, my_fn)
    unlist(vec2)
    
    

    示例答案:0 0 0 2 3

    【讨论】:

      猜你喜欢
      • 2013-04-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多