R通过将名称与df列值匹配来填充矢量

时间:2018-05-03 19:05:14

标签: r

我有一个用零填充的命名向量

toy1<- rep(0, length(37:45))
names(toy1) <- 37:45

我想用数据框中的计数数据填充向量

size    count
37      1.181
38      0.421
39      0.054
40      0.005
41      0.031
42      0.582
45      0.024

我需要帮助找到一种方法将大小值与矢量名称匹配,然后将相应的计数值输入到该矢量位置

3 个答案:

答案 0 :(得分:3)

可能很简单:

toy1[ as.character(dat$size) ] <- dat$count
toy1

#   37    38    39    40    41    42    43    44    45 
#1.181 0.421 0.054 0.005 0.031 0.582 0.000 0.000 0.024 

R的分配索引可以包含字符值。如果您刚刚尝试使用原始列进行索引:

toy1[ dat$size ] <- dat$count

你会得到的(我最初的):

> toy1
   37    38    39    40    41    42    43    44    45                                                             
0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000    NA    NA    NA    NA    NA    NA    NA    NA    NA    NA 

   NA    NA    NA    NA    NA    NA    NA    NA    NA    NA    NA    NA    NA    NA    NA    NA    NA 1.181 0.421 

0.054 0.005 0.031 0.582    NA    NA 0.024 

发生这种情况是因为发生了数字索引,并且向量的长度有默认扩展,以容纳最多45个数字。

如果数据框的版本号不在37:45的范围内,我确实收到使用match的警告,其中no匹配为0,但我也得到了预期的结果:< / p>

toy1[ match( as.character( dat$size), names(toy1) , nomatch=0) ] <- dat$count
#------------
Warning message:
In toy1[match(as.character(dat$size), names(toy1), nomatch = 0)] <- dat$count :
  number of items to replace is not a multiple of replacement length
> toy1
   37    38    39    40    41    42    43    44    45 
1.181 0.421 0.054 0.005 0.031 0.582 0.000 0.000 0.000 

match函数是merge函数的核心,但此应用程序将比merge数据框快得多

答案 1 :(得分:2)

假设您的数据框是 df ,那么您只需更新 toy1 中的记录,以获取数据框中可用的记录:

toy1[as.character(df$size)]    <- df$count

编辑:在更新记录之前检查匹配 m m df size 列中的匹配索引:

m <- match(names(toy1), as.character(df$size))

然后,对于匹配的 toy1 中的索引,可以更新如下:

toy1[which(!is.na(m))]    <- df$count[m[!is.na(m)]]

PS:有效的方法是将 toy1 定义为数据框,并通过 size 列执行外部联接。

答案 2 :(得分:1)

首先,让我们加载数据。

toy1<- rep(0, length(37:45))
names(toy1) <- 37:45
df = read.table(text="37      1.181
38      0.421
39      0.054
40      0.005
41      0.031
42      0.582
45      0.024")
names(df) = c("size","count")

现在,我提出了一个非常难看的解决方案。我们仅更新toy1,其中toy1的名称显示在df$size中。我们通过在df$count中获取匹配的索引来返回df。我使用sapply来获取索引的向量。在这两种尺寸上,我们只查找names(toy1)中出现df$size的地方。

toy1[names(toy1) %in% df$size] = df$count[sapply(names(toy1)[names(toy1) %in% df$size],function(x){which(x == df$size)})]

但是,这不是很优雅。相反,您可以将toy1转换为data.frame。

toydf = data.frame(toy1 = toy1,name = names(toy1),stringsAsFactors = FALSE)

现在,我们可以使用merge来获取值。

updated = merge(toydf,df,by.x = "name",by.y="size",all.x=T)

这将返回3列data.frame。然后,您可以从中提取count列,将NA替换为0,然后就完成了。

updated$count[is.na(updated$count)] = 0
updated$count
#> [1] 1.181 0.421 0.054 0.005 0.031 0.582 0.000 0.000 0.024