我们假设我有一个数据框,表明每个人的因素水平:
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中的矢量化代码?
答案 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)]