2016-11-04 23 views
0

我想从某个data.frame 乘几列* DF1 *百分比匹配的列标题在* df1 *。这些在数据中给出。框架df2,第1列,称为ID。我希望输出如df3乘两个不同data.frames与来自输入列新columnheaders新data.frame

请注意,我的数据集很大。 df1有13000行33列。在df2有136行和3列。

处理这个问题的最佳方法是什么?

df1,df2,df3的示例在下面给出。

DF1

Date     V1    V2   V3   V4 
 
1/1/2000    0    0.4   0    0 
 
2/1/2000    0    0.1   0    0.1 
 
3/1/2000    0.5    0    0    1 
 
4/2000     0.8    1.5   1    1

DF2

ID    Subbasin  Percentage 
 
V1     001    0.4 
 
V4     001    0.6 
 
V1     002    0.2 
 
V2     002    0.8 
 
V1     003    0.1 
 
V2     003    0.3 
 
V3     003    0.2 
 
V4     003    0.4

DF3

Date     001    002    003 
 
1/1/2000    0    0.32   0.12 
 
2/1/2000    0.06   0.08   0.07 
 
3/1/2000    0.8    0.1    0.45 
 
4/2000     0.92   1.36   1.13

我想我必须先从省略日期,与

df1 <- NULL 
+0

嗨另一种选择,如果任何回答解决你的问题,你可以点击“接受”,以便其他人可以看到它?谢谢 – agenis

回答

0

您可以使用稀疏矩阵做这个矩阵乘法,后对第二个数据进行一些改造。框架:

library(dplyr); library(Matrix); library(reshape2) 
m1 <- df1 %>% select(-Date) %>% as.matrix 
m2 <- dcast(df2, ID~subbasin, fill=0) %>% select(-ID) %>% as.matrix %>% Matrix(sparse=T) 
m1 %*% m2 
#### 4 x 3 Matrix of class "dgeMatrix" 
####   1 2 3 
#### [1,] 0.00 0.32 0.12 
#### [2,] 0.06 0.08 0.07 
#### [3,] 0.80 0.10 0.45 
#### [4,] 0.92 1.36 1.13 

如果df2没有任何零,则可以使用。如果是这样,你必须添加一些技巧来获得正确的稀疏性。

我用这个重新创建的数据:

df1 = data.frame(Date=c("1/1/2000", "1/2/2000", "1/3/2000", "1/4/2000"), 
       V1=c(0, 0, .5, .8), 
       V2=c(.4,.1,0, 1.5), 
       V3=c(0,0,0,1), 
       V4=c(0, .1, 1, 1)) 
df2=data.frame(ID=c("V1", "V4", "V1", "V2", "V1", "V2", "V3", "V4"), 
       subbasin=as.character(c(1,1,2,2,3,3,3,3)), 
       percentage=c(4, 6, 2, 8, 1, 3, 2, 4)/10) 
0

考虑这样你变换两次使用reshape2包:1)melt(宽长); 2)产品字段merge(df1和df2); 3)dcast(长宽):

library(reshape2) 

df1 <- read.table(text="Date V1 V2 V3 V4 
1/1/2000 0 0.4 0 0 
2/1/2000 0 0.1 0 0.1 
3/1/2000 0.5 0 0 1 
4/2000 0.8 1.5 1 1", 
header=TRUE, stringsAsFactors = FALSE) 

df2 <- read.table(text="ID Subbasin Percentage 
V1 001 0.4 
V4 001 0.6 
V1 002 0.2 
V2 002 0.8 
V1 003 0.1 
V2 003 0.3 
V3 003 0.2 
V4 003 0.4", 
    header=TRUE, colClasses=c("character", "character", "numeric")) 

df1 <- melt(df1, id.vars=c("Date"), variable.name="ID") 

df3 <- merge(df1, df2, by=c("ID")) 
df3$product <- df3$value * df3$Percentage 

df3 <- dcast(df3, Date~Subbasin, fun.aggregate=sum, value.var="product") 
df3 
#   Date 001 002 003 
# 1 1/1/2000 0.00 0.32 0.12 
# 2 2/1/2000 0.06 0.08 0.07 
# 3 3/1/2000 0.80 0.10 0.45 
# 4  4/2000 0.92 1.36 1.13 
0

下面是使用base R

df3 <- df1[-4] 
df3[ -1] <- as.matrix(df1[-1]) %*% xtabs(Percentage~ ID + Subbasin, df2) 
df3 
#  Date V1 V2 V4 
#1 1/1/2000 0.00 0.32 0.12 
#2 2/1/2000 0.06 0.08 0.07 
#3 3/1/2000 0.80 0.10 0.45 
#4 4/2000 0.92 1.36 1.13 
相关问题