使用不同列应用函数 - R.

时间:2013-07-01 15:38:59

标签: arrays r vector

我在r中有一个包含数千行和3个不同列的数组。对于数组中的每一行,我想根据第一列和第三列更改第一列。具体来说,如果第三列中的数字大于第一列中的数字,则应返回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]”时它返回一个包含第三列中所有行的向量,我只想要一个条目在该行中对应于我得到“得分”的行。

2 个答案:

答案 0 :(得分:4)

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

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

答案 1 :(得分: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语句,用于测试您的第二个条件{{1} }。

然后使用(temp[,1] > temp[,3])随机生成所有剩余的案例。这必须是一个向量而不是绘制,否则所有不符合条件1和2的行都将被赋予相同的随机抽取。如果您尝试:

rbinom

您会看到ifelse(temp[,1]<temp[,3],1,ifelse(temp[,1]>temp[,3],0,rbinom(1,1,.5))) 具有相同值的所有行。这与做以下事情一样:

temp[,1]==temp[,3]