我有一个数字向量:
> 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中的数字。当然,将值乘以名称是很重要的。这意味着来自数字向量的Mark_1应该乘以Nr = 60.1020,Mark_2与Stephen_3相乘,40.5880等等。
有人能推荐什么简单的解决方案吗?
发布于 2016-06-28 12:52:02
您可以在只提取vec_exp名称的第一部分(即从Mark_1中提取Mark等)之后使用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 亚瑟是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)]这首先计算匹配,然后只在它们不是NA的情况下将它们相乘。
发布于 2016-06-28 12:57:49
我们可以使用base R方法。将vector转换为带有stack的data.frame,通过从'ind‘中移除子字符串创建'Name’列,并从data.frame ('df1')中删除子字符串。然后,我们可以将'Nr‘和'values’列相乘。
d1 <- merge(df1, transform(stack(vec_exp), Name = sub("_.*", "", ind)), all.y=TRUE)
d1$Nr*d1$values或者使用dplyr,理解起来要容易得多。
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.80162https://stackoverflow.com/questions/38076589
复制相似问题