【问题标题】:turning the non-zeros of a vector into 1's将向量的非零值变为 1
【发布时间】:2015-05-31 19:41:53
【问题描述】:

假设我创建了以下向量:

x = c(1, 3, 5, 0, 7, 8, 0, 4, 5, 0, 8)
x

我想把非零变成一:

for (   i in 1:length(x)   ){
if (x[i]!=0)   x[i] = 1}
x

这很好用,但我想知道是否有人可以想出一种数学方法来执行此操作,而不是使用 if 语句。

【问题讨论】:

  • 使用 c 创建向量 - 不是 rbind
  • 除非您明确什么是“数学”与“非数学”,否则不会
  • 类似 x/x 的东西由于 0/0 问题而无法工作。如果可能的话,我希望能够为这个操作写一个数学表达式。

标签: r if-statement vector


【解决方案1】:

你把它复杂化了。不需要rbind,使用c

x = c(1, 3, 5, 0, 7, 8, 0, 4, 5, 0, 8);
x[x!=0]=1;

【讨论】:

  • 好的,我把它改成了“c”而不是“rbind”……现在有什么想法吗?
  • 答案有你所需要的。 x[x!=0]=1
  • 谢谢,我很感激,但我要求一种通用的数学方法来对向量进行此操作...
【解决方案2】:

官方的代码书呆子方式是y <- !!x :-)

【讨论】:

  • 可惜没有nerd 徽章:)
【解决方案3】:

从逻辑上讲,就是这样做:

as.logical(x) + 0L
#[1] 1 1 1 0 1 1 0 1 1 0 1

【讨论】:

    【解决方案4】:

    这更数学吗?

    x = c(1, 3, 5, 0, 7, 8, 0, 4, 5, 0, 8)
    ceiling(x/.Machine$integer.max)
    
    [1] 1 1 1 0 1 1 0 1 1 0 1 
    

    【讨论】:

    • 当然有创意! ;-)
    猜你喜欢
    • 1970-01-01
    • 2015-10-31
    • 2012-11-11
    • 2016-03-06
    • 2023-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多