Ria*_*iad 1 r multiplication dataframe
我有2个数据帧df1和df2.df1和df2具有相同的大小(行和列)和相同的因子.说:
df1 <- data.frame(a=c('alpha','beta','gamma'), b=c(1,2,3), c=c('x','y','z'), d=c(4,5,6))
a b c d
1 alpha 1 x 4
2 beta 2 y 5
3 gamma 3 z 6
Run Code Online (Sandbox Code Playgroud)
和
df2 <- data.frame(a=c('alpha','beta','gamma'), b=c(7,8,9), c=c('x','y','z'), d=c(10,11,12))
a b c d
1 alpha 7 x 10
2 beta 8 y 11
3 gamma 9 z 12
Run Code Online (Sandbox Code Playgroud)
我想将这两个数据帧相乘并获得像tyhis这样的结果:
a b c d
1 alpha 7 x 40
2 beta 16 y 55
3 gamma 27 z 72
Run Code Online (Sandbox Code Playgroud)
我做了一些搜索并尝试了以下代码:
M <- merge(df1,df2,by=c('a','c'))
S <- M[,grepl("*\\.x$",names(M))] * M[,grepl("*\\.y$",names(M))]
cbind(M[,c('a','c'),drop=FALSE],S)
Run Code Online (Sandbox Code Playgroud)
此代码工作正常,并提供以下内容:
a c b.x d.x
1 alpha x 7 40
2 beta y 16 55
3 gamma z 27 72
Run Code Online (Sandbox Code Playgroud)
问题:有没有更好的方法来实现这种乘法?请记住,我的数据框具有相同数量的行,列和因子名称.我的现实生活数据帧要大得多,包括行和列.
这样的事可能吗?:
data.frame(
Map(function(x,y) if(all(is.numeric(x),is.numeric(y))) x * y else x, df1, df2)
)
# a b c d
#1 alpha 7 x 40
#2 beta 16 y 55
#3 gamma 27 z 72
Run Code Online (Sandbox Code Playgroud)
一些基准测试:
smp <- sample(1:4,50000,replace=TRUE)
df1big <- df1[,smp]
df2big <- df2[,smp]
lmfun <- function() {
out <- data.frame(
Map(function(x,y) if(all(is.numeric(x),is.numeric(y))) x * y else x,
df1big, df2big)
)
}
johnfun <- function() {
sel <- sapply(df1big, is.numeric)
df1big[,sel] <- df1big[,sel] * df2big[,sel]
}
system.time(lmfun())
# user system elapsed
# 6.06 0.00 6.07
system.time(johnfun())
# user system elapsed
# 24.91 0.00 24.99
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2530 次 |
| 最近记录: |