Во-первых, давайте загрузим данные.
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)
Возвращает data.frame с 3 столбцами. Затем вы можете извлечь из этого столбец 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