【问题标题】:Copy a value from another variable if statement is true如果语句为真,则从另一个变量中复制一个值
【发布时间】:2014-05-25 23:05:42
【问题描述】:

我有一个小问题,或者实际上有点大。 我有一个包含 3 个变量的数据集,我使用 atm,我们称它们为 var1、var2 和 var3。 我总共有超过 3000 个观察值,每个变量都有 NA 值。

var1=age_1、var2=Yes/No 和 var3=age_2

我想要做的是如果 var2="Yes" 来自 var1 的值应该被 coopied 到 var3 中。 我是这样做的:

var3[var2=="Yes"]<-var1

但我收到错误消息:

Error in var3[var2 == "Yes"] <-var1 :

下标作业中不允许使用 NA

有人有一个快速的解决方案,我该如何解决?

【问题讨论】:

  • var3

标签: r variables


【解决方案1】:

你可以试试

var3 <- ifelse(var2 == "Yes", var1, var3)

【讨论】:

    【解决方案2】:

    该错误听起来像是您在 var2 中有 NA 值。你可以测试看看是否sum(is.na(var))&gt;0所以如果你有缺失值R不想猜测缺失是否与“是”或“否”相同,所以你会得到错误。

    此外,通过仅对赋值的一侧进行索引,您不一定会跨行匹配值。因此,即使您修复了 NA 值,您也可能会收到 number of items to replace is not a multiple of replacement length 错误。

    一个技巧是使用which 从逻辑索引中删除NA 值并将它们转换为数字索引。然后,一旦知道要替换的行,就可以在赋值的两边使用相同的索引。

    var1 <- c(10, 20, 30)
    var2 <- c("No", "Yes", "No")
    var3 <- c(100, 200, 3000)
    
    idx <- which(var2=="Yes")
    var3[idx] <- var1[idx]
    
    var3
    # [1]  100   20 3000
    

    或者您可以使用ifelse 函数,它使所有这些步骤变得更加容易

    var3<-ifelse(var2=="Yes", var1, var3)
    

    【讨论】:

    • 为什么这个答案(实际上是OP的命令)不起作用? stackoverflow.com/questions/5824173/…看来括号只能用来替换为固定数字,不能用来替换变量
    • @luchonacho 我不确定您具体指的是哪个答案。如果您指的是这个,我已经添加了一些示例数据,您可以使用它们来运行并验证它是否有效。
    • 如果您谈论的是if(i %in% "B") junk$nm &lt;- "b" 部分,那是因为一旦if 语句为真一次,那么junk$nm &lt;- "b" 就会运行,它会将“b”分配给该列中的每个值。该声明不知道“当前”行是什么。它不使用i
    • 对不起。我的意思是我分享的链接上的那个。本质上,var3[var2=="Yes"]&lt;-var1。我收到消息说替换的行数与数据不同。
    • @luchonacho 那是因为你根本没有索引var1。如果所有向量的长度相同,它应该看起来像var3[var2=="Yes"]&lt;-var1[var2=="Yes"]
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-30
    • 2021-12-17
    • 1970-01-01
    • 2014-06-27
    • 2013-08-02
    • 2022-01-17
    相关资源
    最近更新 更多