首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >将数字向量的值与数据帧中的特定值相乘

将数字向量的值与数据帧中的特定值相乘
EN

Stack Overflow用户
提问于 2016-06-28 12:42:17
回答 2查看 58关注 0票数 0

我有一个数字向量:

代码语言:javascript
运行
复制
> 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"))

然后我有一个数据框架,如下所示:

代码语言:javascript
运行
复制
        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中的数字。当然,将值乘以名称是很重要的。这意味着来自数字向量的Mark_1应该乘以Nr = 60.1020,Mark_2与Stephen_3相乘,40.5880等等。

有人能推荐什么简单的解决方案吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-06-28 12:52:02

您可以在只提取vec_exp名称的第一部分(即从Mark_1中提取Mark等)之后使用Mark来匹配这些名称。

代码语言:javascript
运行
复制
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 

亚瑟是NA,因为data.frame里没有对手。

如果您想像以前一样在数据中保留这些条目而不匹配,您可以这样做:

代码语言:javascript
运行
复制
i <- match(sub("^([^_]+).*", "\\1", names(vec_exp)), df$Name)
vec_exp[!is.na(i)] <- vec_exp[!is.na(i)] * df$Nr[na.omit(i)]

这首先计算匹配,然后只在它们不是NA的情况下将它们相乘。

票数 2
EN

Stack Overflow用户

发布于 2016-06-28 12:57:49

我们可以使用base R方法。将vector转换为带有stackdata.frame,通过从'ind‘中移除子字符串创建'Name’列,并从data.frame ('df1')中删除子字符串。然后,我们可以将'Nr‘和'values’列相乘。

代码语言:javascript
运行
复制
d1 <- merge(df1, transform(stack(vec_exp), Name = sub("_.*", "", ind)), all.y=TRUE)
d1$Nr*d1$values

或者使用dplyr,理解起来要容易得多。

代码语言:javascript
运行
复制
library(dplyr)
library(tidyr)
stack(vec_exp) %>%
        separate(ind, into = c("Name", "ind")) %>%
        left_join(., df1, by = "Name") %>% 
         mutate(res = values*Nr) %>% 
        .$res
#[1]         NA  393.28193 1033.38894 1388.53430  361.84000  
#[6]    581.46000  732.59000   60.94371  161.56303  519.80162
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38076589

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档