R 将数值向量中的值乘以数据帧中的特定值
我有一个数值向量:R 将数值向量中的值乘以数据帧中的特定值,r,R,我有一个数值向量: > dput(vec_exp) structure(c(12.344902729712, 6.54357482855349, 17.1939193108764, 23.1029632631654, 8.91495023159554, 14.3259091357051, 18.0494234749187, 2.92524638658168, 5.10306474037357, 2.66645609602021), .Na
> dput(vec_exp)
structure(c(12.344902729712, 6.54357482855349, 17.1939193108764,
23.1029632631654, 8.91495023159554, 14.3259091357051, 18.0494234749187,
2.92524638658168, 5.10306474037357, 2.66645609602021), .Names = c("Arthur_1",
"Mark_1", "Mark_2", "Mark_3", "Stephen_1", "Stephen_2",
"Stephen_3", "Rafael_1", "Marcus_1", "Georg_1"))
然后我有一个数据框,如下所示:
Name Nr Numb
1 Rafael 20.8337 20833.7
2 Joseph 25.1682 25168.2
3 Stephen 40.5880 40588.0
4 Leon 198.7730 198773.0
5 Thierry 16.5430 16543.0
6 Marcus 31.6600 31660.0
7 Lucas 39.6700 39670.0
8 Georg 194.9410 194941.0
9 Mark 60.1020 60102.0
10 Chris 56.0578 56057.8
我想将数值向量中的数字乘以此数据帧中列Nr
中的数字。当然,将值乘以名称很重要。这意味着数字向量中的标记_1应乘以Nr=60.1020
,与标记_2相同,Stephen_3应乘以40.5880
,等等
有人能推荐任何简单的解决方案吗?您可以使用
match
在只提取vec\u exp
名称的第一部分后匹配名称,即从Mark\u 1
中提取Mark
等
vec_exp * df$Nr[match(sub("^([^_]+).*", "\\1", names(vec_exp)), df$Name)]
# Arthur_1 Mark_1 Mark_2 Mark_3 Stephen_1 Stephen_2 Stephen_3 Rafael_1 Marcus_1 Georg_1
# NA 393.28193 1033.38894 1388.53430 361.84000 581.46000 732.59000 60.94371 161.56303 519.80162
Arthur是NA,因为data.frame中没有匹配项
如果要保持这些条目与以前一样在数据中不匹配,可以这样做:
i <- match(sub("^([^_]+).*", "\\1", names(vec_exp)), df$Name)
vec_exp[!is.na(i)] <- vec_exp[!is.na(i)] * df$Nr[na.omit(i)]
i您可以使用match
在仅提取vec_exp
名称的第一部分后匹配名称,即从Mark_1
中提取Mark
等
vec_exp * df$Nr[match(sub("^([^_]+).*", "\\1", names(vec_exp)), df$Name)]
# Arthur_1 Mark_1 Mark_2 Mark_3 Stephen_1 Stephen_2 Stephen_3 Rafael_1 Marcus_1 Georg_1
# NA 393.28193 1033.38894 1388.53430 361.84000 581.46000 732.59000 60.94371 161.56303 519.80162
Arthur是NA,因为data.frame中没有匹配项
如果要保持这些条目与以前一样在数据中不匹配,可以这样做:
i <- match(sub("^([^_]+).*", "\\1", names(vec_exp)), df$Name)
vec_exp[!is.na(i)] <- vec_exp[!is.na(i)] * df$Nr[na.omit(i)]
i我们可以使用base R
方法。将向量
转换为带有堆栈
的数据帧
,通过从“ind”中删除子字符串和与data.frame('df1')合并来创建“Name”列。然后,我们可以将“Nr”和“values”列相乘
d1 <- merge(df1, transform(stack(vec_exp), Name = sub("_.*", "", ind)), all.y=TRUE)
d1$Nr*d1$values
我们可以使用base R
方法。将向量
转换为带有堆栈
的数据帧
,通过从“ind”中删除子字符串和与data.frame('df1')合并来创建“Name”列。然后,我们可以将“Nr”和“values”列相乘
d1 <- merge(df1, transform(stack(vec_exp), Name = sub("_.*", "", ind)), all.y=TRUE)
d1$Nr*d1$values