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