将矢量扩展为重复测量的有效方法

时间:2014-04-09 16:33:48

标签: r

我们假设我有一个数据框,表明每个人的因素水平:

I.df = data.frame(variant = sample(x=c(0,1,2), size=30, replace = TRUE), tissue = sample(x=as.factor(c('cereb','hipo','arc')), size=30, replace = TRUE))

我还有一个载体,其中包含每个因素的平均值:

means.tissues = c(1.2, 3, 0.5)
names(means.tissues) = c('cereb', 'hipo', 'arc')

然后我想创建一个长度等于I.df的行数的向量,其中值是给定行的相应组织。即,

ind.tissues = rep(NA, nrow(I.df))
for(i in 1:nrow(I.df))
{
ind.tissues[i] = means.tissues[names(means.tissues) == I.df$tissue[i]]
}

我认为for循环是一种相当低效的方法,特别是对于具有非常大的n的矩阵,是否有更好/更有效的方法来使用R中的矢量化代码?

1 个答案:

答案 0 :(得分:4)

您可以使用match

ind.tissues = means.tissues[match(I.df$tissue, names(means.tissues))]

match函数返回参数1中每个元素的参数2中的位置。然后我们使用这些索引来获取means.tissues中的正确元素。

修改:正如@Joran在评论中所提到的,由于means.tissues是一个命名向量,您可以按名称查找而不是使用match

ind.tissues <- means.tissues[as.character(I.df$tissue)]