我有一个用零填充的命名向量
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
我需要帮助找到一种方法将大小值与矢量名称匹配,然后将相应的计数值输入到该矢量位置
答案 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