r - 如何在 R 中划分缺失数据的不等数据帧

标签 r dataframe division missing-data

我有两个具有不同尺寸的数据框。并想要划分两个数据框。我的原始数据框有巨大的编号。列数超过 4000,因此,给出每列的名称可能很麻烦。此外,如下所示,一个数据帧中的列可能在其他数据帧中没有相应的列。其中列名A.SA是公司名称,S表示其公司A的价格数据, A.V表示是A公司的成交量数据。一个重要的细节是我的样本量是从 2000 年到 2014 年。因此,如果公司 a 在 2002 年开始交易,那么它在 2000 年和 2001 年将出现 NA。那么,我也应该如何解决这个问题。

df1<- S
         Date      A.S B.S  C.S
        01/01/2000  1   10  19
        02/01/2000  2   11  20
        03/01/2000  3   12  21
        04/01/2000  NA  13  22
        05/01/2000  NA  14  23
        06/01/2000  NA  NA  24
        07/01/2000  7   NA  25
        08/01/2000  8   NA  26
        09/01/2000  9   18  27
 The other dataframe 
df2<-V
    Date        A.V B.V
    01/01/2000  12  NA
    02/01/2000  12  NA
    03/01/2000  12  3
    04/01/2000  12  4
    05/01/2000  12  5
    06/01/2000  NA  6
    07/01/2000  NA  7
    08/01/2000  NA  8
    09/01/2000  NA  9

并希望得到所需的结果如下。

    df3<-df1/df2
 Date        A      B   C
01/01/2000  0.08    NA  NA
02/01/2000  0.17    NA  NA
03/01/2000  0.25    4   NA
04/01/2000  NA      3   NA
05/01/2000  NA      3   NA
06/01/2000  NA      NA  NA
07/01/2000  NA      NA  NA
08/01/2000  NA      NA  NA
09/01/2000  NA      2   NA

非常感谢您的帮助

最佳答案

有几种方法可以解决这个问题。一种方法是使用正则表达式来同质化列名称(我为此创建了“编辑”数据框,您当然可以使用原始数据来执行此操作。

#edit column names
df1_edit <- df1
colnames(df1_edit) <- gsub("\\.S","",colnames(df1_edit))

df2_edit <- df2
colnames(df2_edit) <- gsub("\\.V","",colnames(df2_edit))

#create vector of all columns that need to be made, excluding 'Date'
all_cols <- unique(c(colnames(df1_edit)[-1],colnames(df2_edit)[-1]))

#create missing columns
df1_edit[,setdiff(all_cols,colnames(df1_edit))] <- NA
df2_edit[,setdiff(all_cols,colnames(df2_edit))] <- NA

#now divide the dataframes, using all_cols to ensure correct order (and thus division)
res <- cbind(Date=df1_edit$Date, df1_edit[,all_cols]/df2_edit[,all_cols])
> res
        Date          A         B  C
1 01/01/2000 0.08333333 10.000000 NA
2 02/01/2000 0.16666667  5.500000 NA
3 03/01/2000 0.25000000  4.000000 NA
4 04/01/2000 0.33333333  3.250000 NA
5 05/01/2000 0.41666667  2.800000 NA
6 06/01/2000 0.50000000  2.500000 NA
7 07/01/2000 0.58333333  2.285714 NA
8 08/01/2000 0.66666667  2.125000 NA
9 09/01/2000 0.75000000  2.000000 NA

另一种方法是进行一些数据 reshape 。首先,我们将两个数据帧都转换为 long 并操作“变量”变量。然后我们合并(all=T 生成我们的 NA)、分割并 reshape 为宽。

library(data.table)

df1_l <- melt(setDT(df1),id.var="Date", value.var="value.S")
df1_l$var <-gsub("\\.S","",df1_l$variable)
df2_l <- melt(setDT(df2), id.var="Date",value.var="value.V")
df2_l$var <-gsub("\\.V","",df2_l$variable)

df_merge <- merge(df1_l, df2_l, by=c("Date","var"),all=T)
df_merge$res <- df_merge$value.x/df_merge$value.y

res <- dcast(df_merge, Date~var,value.var="res")

> res
         Date          A         B  C
1: 01/01/2000 0.08333333 10.000000 NA
2: 02/01/2000 0.16666667  5.500000 NA
3: 03/01/2000 0.25000000  4.000000 NA
4: 04/01/2000 0.33333333  3.250000 NA
5: 05/01/2000 0.41666667  2.800000 NA
6: 06/01/2000 0.50000000  2.500000 NA
7: 07/01/2000 0.58333333  2.285714 NA
8: 08/01/2000 0.66666667  2.125000 NA
9: 09/01/2000 0.75000000  2.000000 NA

关于r - 如何在 R 中划分缺失数据的不等数据帧,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34557692/

相关文章:

python - Pandas 按逻辑日期对数据框进行排序

r - 将NA值为空白的数据帧写入csv文件

python - 比较 Pandas Dataframe 的匹配行和列的差异

r - 在 R 中使用具有不均匀长度变量的熔化/类型转换

python - 在 Python 中从 Dataframe 中过滤多个条件

java - C中的Python样式整数除法和模数

mysql - mysql奇怪的除法问题

linux - 如何在 Linux shell 中对变量进行除法?

r - 将 tibble 作为带有行名称的矩阵展开

r - Quantstrat 多种货币。 Blotter::UpdateAcct 中可能有错误吗?