0

我在 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]”时,它会返回一个向量,其中包含第三列中的所有行,我只想要该行中的一个条目对应于我用“分数”得到的行。

4

2 回答 2

4

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

rbinom(nrow(temp), 1, (temp[,1]<temp[,3])+(temp[,1]==temp[,3])*0.5)
于 2013-07-01T16:17:59.380 回答
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] < temp[,3])何时为的值,而是提供FALSE第二个ifelse语句,用于测试您的第二个条件(temp[,1] > 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))
于 2013-07-01T15:44:57.710 回答