值的条件赋值 - ifelse() 当条件和预期的返回值没有相同的特征时是最好的吗? [R]

Posted

技术标签:

【中文标题】值的条件赋值 - ifelse() 当条件和预期的返回值没有相同的特征时是最好的吗? [R]【英文标题】:Conditional assignment of value - is ifelse() the best when condition and intended return value don't have same features? [R] 【发布时间】:2021-10-05 13:32:07 【问题描述】:

我想有条件地为变量赋值。例如,我想创建一个alphabet变量,如果某个字母是小写的,则分配给它letters,或者如果某个字母是大写的,则分配给它LETTERS

首先想到的是使用<-ifelse()。但是,这在我的情况下不起作用:

> alphabet <- ifelse("B" %in% letters, letters, LETTERS)
> alphabet
[1] "A"

事实上,我看到,关于ifelse(test, yes, no),函数描述说:“ifelse 返回一个与test 形状相同的值,其中填充了从yes 或@987654331 中选择的元素@ [...]”。在值部分,它指定了更多内容:“与test 和来自@987654334 值的数据值相同长度和属性(包括维度和“class”)的向量@ 或 no. [...]"。

好的 - 我意识到我可以使用 assign() 而不是 &lt;- 并且值已正确分配给变量:

> ifelse("B" %in% letters, assign("alphabet", letters), assign("alphabet", LETTERS))
[1] "A"
> alphabet
 [1] "A" "B" "C" "D" "E" "F" "G" "H" "I" "J" "K" "L" "M" "N" "O" "P" "Q" "R" "S" "T" "U" "V" "W" "X" "Y" "Z"

但是,根据上面的输出,ifelse() 仍然返回所选字母集中的第一个字符。

我对此不满意,因为...

    ...事实上我的代码返回了我不需要的东西,并且... ...事实上ifelse() 甚至无法与&lt;- 一起使用...

让我想知道是否有更好的方法来做到这一点。

是否有首选/更有效/更好的礼仪或以任何方式更合适的选项来有条件地赋值,或者我应该忽略困扰我的事情?

【问题讨论】:

我猜你需要反转,即letters %in% "B",因为所有参数都应该具有相同的长度。此外,letters 都是小写值。所以,你的逻辑应该是LETTERS %in% 'B' 如果您使用不同的长度,即 'B' %in% 个字母,更好的选择是if/elsealphabet &lt;- if('B' %in% letters) letters else LETTERS @akrun 也许我不清楚:我想检查某个字母是小写还是大写。如果是小写,我想创建alphabet 并将letters 分配给它;如果是大写,我想将LETTERS 分配给它。这让我对在条件下使用lettersLETTERS 无动于衷。我更新了问题,使其更清楚。无论如何,将letters %in% "B"&lt;- 一起使用是行不通的,因为它给了我[1] "A" "b" "C" [...],带有小写的“b”。将letters %in% Bassign() 一起使用就像在我的问题中一样有效,但它并不能消除我在问题中的第1 点。 你试过我显示的代码alphabet &lt;- if('B' %in% letters) letters else LETTERS @akrun 在您编辑之前我已经看到了您的评论。这样可以更整洁地完成工作,谢谢! 【参考方案1】:

我们可以用if/else代替ifelse

alphabet <- if('B' %in% letters) letters else LETTERS

【讨论】:

以上是关于值的条件赋值 - ifelse() 当条件和预期的返回值没有相同的特征时是最好的吗? [R]的主要内容,如果未能解决你的问题,请参考以下文章

使用 ifelse 添加具有条件值的新列

C语言中的条件赋值语句和if——else语句执行效率比较,哪一个效率高些,坐等高手解惑

js基础⑤

NetLogo 列表和条件修改

R语言IfElse条件语句实战

如何在 if else 循环中对同一数据使用多个条件? - java/安卓