R:如何在向量上使用类似“if”的函数但没有“ifelse”,因为如果没有,它应该啥都不做

Posted

技术标签:

【中文标题】R:如何在向量上使用类似“if”的函数但没有“ifelse”,因为如果没有,它应该啥都不做【英文标题】:R: How to use a "if"-like-function on vectors but no "ifelse" because if no it should do nothingR:如何在向量上使用类似“if”的函数但没有“ifelse”,因为如果没有,它应该什么都不做 【发布时间】:2015-02-06 19:53:17 【问题描述】:

我尝试根据第三个变量的条件用另一个变量的值一次覆盖多个变量(一种日历中的月份)。如果条件为假,则不应发生任何事情。

我认为 If 函数会很有帮助,因为可以省略 else 但不,它不适用于向量。

    DF1[,3:4] <- if (DF1$v7==5) DFDF1$v5  
the condition has length > 1 and only the first element will be used

另一方面,适合向量是 ifelse,但它告诉我

    DF1[,3:4] <- ifelse (DF1$v7==5, DF1$v5, )
"argument "no" is missing, with no default", 

那么我应该怎么做才能实现我的目标呢?

感谢您的任何建议,像我这样的初学者感激不尽!

PS:变量只是示例。

编辑:我正在寻找一种方法,我可以在其中解决应该由列号替换的变量,如 DF1[, 3:4] 因为否则我将不得不输入到 12 个不同的变量名(在我原来的 DF 中)。

【问题讨论】:

我的第一个想法是尝试DF1[,3:4] &lt;- ifelse (DF1$v7==5, DF1$v5, DF1[,3:4])。但是,这里存在一个概念问题:您尝试将两列(3 和 4)替换为仅一列(v5,如果您有匹配项)。因此,您可能遇到的问题与类似 if 的函数无关,而是与您要实现的目标有关? @Jealie - 这也是我的第一个想法。在我的真实数据中,我尝试用 96 个月期间每个月的状态(工作、在校、不工作)填充日历,变量为几个月每周给定的工作时间(v7)和时间采访(v5)。所以我的想法是用工作时间覆盖状态([,3:4] 代表第一年的一月和二月),以查看某人在哪里工作,但缺少工作时间并在之后更好地估算。最后,DF 应该是最佳匹配分析的基础。 但我最好是一般性的答案。 【参考方案1】:

一栏接一栏。关于else条件,使用原值即可

for (i in 3:4)
 DF[,i] <- ifelse(DF$v7 == 5, DF1$v5, DF[,i])

【讨论】:

对于更复杂的数据还有其他方法吗?因为当我想将此应用于 2 个条件时,我彼此嵌套(两个 ifelse)对于我的系统来说需要处理很多。谢谢! 不能把ifelse条件改成复杂的吗? 您的意思是复杂的,例如与布尔连接器链接为“&&”的多个条件?我试过了,但有一个条件是'"(all (is.na(DF1[,i]))"',我不知道为什么,但结果是所有行和行都被“then”的值覆盖"/DF1$v5.【参考方案2】:

我能想到一种可行的方法:

 DF1[DF1$v7==5,3:4] <-cbind( DF1$v5,DF1$v5 )[DF1$v7==5, ]

作业两边的项目数量应匹配。经测试。当 DF1$v5 是一个因素但按预期执行时,它提供整数值。也可以这样做:

 DF1[DF1$v7==5,3:4] <- DF1[ , c('v5','v5')][DF1$v7==5, ]

【讨论】:

谢谢。我喜欢第二行代码。它适用于样本数据,但如果有例如 12 行要填充,应该怎么做。要键入 12 'v5',因为 DF1[DF1$v7==5,3:14] &lt;- DF1[ , c('v5',''v5','v5','v5','v5','v5','v5','v5','v5','v5','v5',v5')][DF1$v7==5, ] 似乎不是很优雅,是吗?这对我来说很重要,因为我必须一次复制超过 2 个变量。

以上是关于R:如何在向量上使用类似“if”的函数但没有“ifelse”,因为如果没有,它应该啥都不做的主要内容,如果未能解决你的问题,请参考以下文章

如何在 R 中保存循环(使用 if 语句)的结果?

在 if 语句的帮助下,让 R 在 while 循环中跳过某些索引值

在while循环中使用if语句使R跳过某些索引值

使用 for-loop 和 if 函数创建一个新向量?

如何使用 remove_if 从向量中删除元素

如何根据在 R 中使用 strsplit 的分隔类型定义 if 语句?