【问题标题】:Applying Function Using Different Columns - R使用不同的列应用函数 - R
【发布时间】:2013-06-28 19:19:57
【问题描述】:

我在 r 中有一个数组,它有数千行和三个不同的列。对于数组中的每一行,我想根据第一列和第三列更改第一列。具体来说,如果第三列的数字大于第一列的数字,它应该返回一个1,如果第三列的数字小于第一列的数字,它应该返回一个0,如果它们是相同的数字,应该随机选择 1 或 0。

    temp[,1]<- sapply(
                        temp[,1],
                        function(score){
                           if(temp[,3]>score){1}
                           else if(temp[,3]<score){0}else
                           else if(temp[,3]==score){sample(0:1,1)}})

这是我到目前为止的代码,但它不是很有效,我认为当我调用“temp[,3]”时它会返回一个向量,其中包含第三列中的所有行,我只想要一个条目在与我用“分数”得到的行相对应的那一行中。

【问题讨论】:

    标签: arrays r vector


    【解决方案1】:

    这也可以使用算术而不是条件来完成:

    rbinom(nrow(temp), 1, (temp[,1]<temp[,3])+(temp[,1]==temp[,3])*0.5)
    

    【讨论】:

      【解决方案2】:

      使用ifelse:

      ifelse(temp[,1] < temp[,3], 1, # test condition 1, give 1 if TRUE
             ifelse(temp[,1] > temp[,3], 0, # condition 1 is FALSE, test condition 2
                    rbinom(dim(temp)[1],1,.5))) # condition 2 is FALSE, return random
      

      编辑ifelse 的工作原理是测试一个条件,然后在该条件是 TRUE 时执行某些操作,或者如果是 FALSE,则执行其他操作。您有三个条件,因此不是为第一个条件 (temp[,1] &lt; temp[,3]) 为 FALSE 时提供值,而是提供第二个 ifelse 语句,用于测试您的第二个条件 (temp[,1] &gt; temp[,3])

      然后使用rbinom 随机生成所有剩余案例。这必须是一个向量而不是绘制,因为否则所有不满足条件 1 和 2 的行都将获得相同的随机抽奖。如果你尝试:

      ifelse(temp[,1]<temp[,3],1,ifelse(temp[,1]>temp[,3],0,rbinom(1,1,.5)))
      

      您会看到temp[,1]==temp[,3] 的所有行都具有相同的值。这和做类似的事情是一样的:

      ifelse(temp[,1]<temp[,3],1,ifelse(temp[,1]>temp[,3],0,2))
      

      【讨论】:

      • thomas 我刚刚尝试了这段代码,它运行良好。您能否解释一下为什么第二个 ifelse 嵌入在第一个 ifelse 中?为什么你这样做 rbinom(dim(temp)[1]) 我认为这意味着你正在为我拥有的每一行获取随机数?
      • 更新了一些额外的解释。
      • 啊,我明白了。我来自python,我用来通过循环列表来解决这些问题。我更喜欢 r 处理向量的方式。答案已接受
      猜你喜欢
      • 1970-01-01
      • 2015-02-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多