Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/84.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 将数值向量中的值乘以数据帧中的特定值_R - Fatal编程技术网

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