2013-07-01 17 views
0

我在r中有一个数组,它有成千上万行和三个不同的列。对于数组中的每一行,我想根据第一列和第三列更改第一列。特别是,如果第三列中的数字大于第一列中的数字,则它应该返回1,如果第三列中的数字小于第一列中的数字,则它应返回0,如果它们有相同数量应该随机选择1或0使用不同列的函数 - R

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)}}) 

这是我到目前为止的代码,但它是不完全的工作,我认为当我称之为“临时[3]”它返回一个向量与第三列中的所有行,我只想要该行中的一个条目对应于我用“score”得到的行。

回答

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)) 
+0

托马斯我只是尝试这样的代码它运行完美。你能否解释为什么第二个ifelse嵌入第一个ifelse?你为什么要做rbinom(dim(temp)[1]),我认为这意味着你得到的每行都是随机数字? – appleLover

+0

更新了一些额外的解释。 – Thomas

+0

啊我明白了。我来自python我用来通过循环列表来解决这个问题。我喜欢r更适合矢量的方式。回答接受 – appleLover

4

这也可以用算术来代替条件语句来完成:

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

+1非常好的答案。 – Thomas

+0

聪明答案:) – appleLover