【问题标题】:expand vector in condition-contingent way以条件条件方式扩展向量
【发布时间】:2019-07-29 14:19:34
【问题描述】:

我正在尝试做一些我认为很简单的事情,但我失败了。我想根据另一个对象(一个单独的数据框)的值来扩展一个向量。这是一个可重现的示例:我有向量 v1,其中包含值 {1,2,3}。如果 iris 数据框中的列 Species 包含字符串“setosa”,我想添加字符串 {"moon", "sun"}。我试过了:

v1 <- c(1,2,3)
v1 <- c(v1, c("moon", "sun"))["setosa" %in% iris$Species]
[1] "1"    "2"    "3"    "moon" "sun"

这行得通,正如您从上面的输出中看到的那样。但是如果不满足条件,我会得到一个空向量,而不是原来的 v1(即只是 {1,2,3}):

v1 <- c(v1, c("moon", "sun")) ["nonword" %in% iris$Species]
character(0)

我也试过了:

v1 <- ifelse("setosa" %in% iris$Species, c(v1, c("moon", "sun")), v1)

但这会返回:

[1] "1"

对我能做什么有什么建议吗?如果问题非常基本,我很抱歉,但我一直在寻找以前帖子中的答案,但我无法解决任何问题。

谢谢!

【问题讨论】:

  • 这里foo是什么
  • @akrun,对不起,foo = v1。我清理了帖子的示例,但忘记进行替换。我会在几秒钟内修复它。
  • @akrun,您的解决方案也有效(刚刚尝试过)。我标记了另一个,因为它更简洁:它只需要一行代码,并且不需要构建我不会在脚本的其他地方使用的函数(这是一次性问题)。感谢您的帮助!

标签: r dplyr


【解决方案1】:

您可以使用if/else 而不是ifelse,因为ifelse 返回与test 相同长度的向量,这就是它返回长度为1 的输出与ifelse 的原因。

if("setosa" %in% iris$Species) c(v1, c("moon", "sun")) else v1
#[1] "1"    "2"    "3"    "moon" "sun"

if("nonword" %in% iris$Species) c(v1, c("moon", "sun")) else v1
#[1] 1 2 3

【讨论】:

    【解决方案2】:

    问题与索引有关。这里

    "nonword" %in% iris$Species
    #[1] FALSE
    

    返回单个FALSE,它将被回收到我们要索引的向量的长度,从而产生character(0)。相反,我们可能需要replicate 逻辑向量以匹配输出向量的长度

    v1 <- c(1,2,3)
    v2 <- c("moon", "sun")
    f1 <- function(vec1, vec2, expr) {         
        c(vec1, vec2)[rep(c(TRUE, expr), c(length(vec1), length(vec2)))]
    }
    f1(v1, v2, "nonword" %in% iris$Species)
    #[1] "1" "2" "3"
    f1(v1, v2, "setosa" %in% iris$Species)
    #[1] "1"    "2"    "3"    "moon" "sun" 
    

    【讨论】:

      猜你喜欢
      • 2011-03-03
      • 2015-09-19
      • 2012-06-17
      • 2022-07-05
      • 1970-01-01
      • 1970-01-01
      • 2021-10-08
      • 2013-09-02
      • 1970-01-01
      相关资源
      最近更新 更多