首页 文章

如何在R中删除具有相同列 Headers /名称的相同数据帧中的两列,并且缺少数据

提问于
浏览
1

我有一个包含8000列和3785行的数据帧 . 列是公司名称,因此,我想通过从投标价格中减去其要价,即公司/股票的价差= A.ASK- A.BID来计算公司的价差 . 在列名中A.ASK表示A是公司名称,而.ASK表示它是公司的ASK价格,其中.BID是A的BID价格 . 在我的数据框架中,公司的所有询问和出价都是并排列,如下面的示例数据框所示 . 此外,我缺少数据,例如,如果公司C在2001年开始交易,它将在2000年获得NA . 所以,我想要的不是忽略计算的日期列,另外还有NA的公司要求和出价的返回结果列中的NA

Date        A . ASK A .BID  C. ASK  C. BID
31/12/1999  NA      NA      NA      NA
03/01/2000  NA      NA      NA      NA
04/01/2000  82      77      NA      NA 
05/01/2000  82      77      NA      NA
06/01/2000  82      77      NA      NA
07/01/2000  82      77      NA      NA
10/01/2000  82      77      NA      NA
11/01/2000  82      77      NA      NA
12/01/2000  NA      NA      NA      NA
13/01/2000  NA      NA      NA      NA
14/01/2000  NA      NA      70      67
17/01/2000  NA      NA      70      67
18/01/2000  97      94      70      67
19/01/2000  97      92      70      67

DF2 <-df1

Date        A   C
31/12/1999  NA  NA
03/01/2000  NA  NA
04/01/2000  5   NA
05/01/2000  5   NA
06/01/2000  5   NA
07/01/2000  5   NA
10/01/2000  5   NA
11/01/2000  5   NA
12/01/2000  NA  NA
13/01/2000  NA  NA
14/01/2000  NA  3
17/01/2000  NA  3
18/01/2000  3   3
19/01/2000  5   3

非常感谢您的帮助

1 回答

  • 2

    具有格式良好的数据,在每个公司的询价和出价之间交替,这使得这相对简单 . 以下代码应该可以满足您的需求 .

    # Import data
    df <- read.table(text = 
                     "Date       A.ASK   A.BID   C.ASK   C.BID
                     31/12/1999  NA      NA      NA      NA
                     03/01/2000  NA      NA      NA      NA
                     04/01/2000  82      77      NA      NA 
                     05/01/2000  82      77      NA      NA
                     06/01/2000  82      77      NA      NA
                     07/01/2000  82      77      NA      NA
                     10/01/2000  82      77      NA      NA
                     11/01/2000  82      77      NA      NA
                     12/01/2000  NA      NA      NA      NA
                     13/01/2000  NA      NA      NA      NA
                     14/01/2000  NA      NA      70      67
                     17/01/2000  NA      NA      70      67
                     18/01/2000  97      94      70      67
                     19/01/2000  97      92      70      67",
                     header = TRUE
    )
    
    # Define a sequence which selects every second column
    # ask_cols starts at column 2
    # bid_cols starts at column 3
    ask_cols <- (1:((ncol(df)-1)/2))*2
    bid_cols <- (1:((ncol(df)-1)/2))*2+1
    
    # Use ask_cols and bid_cols to select columns from df and calculate
    df2 <- df[, ask_cols]-df[, bid_cols]
    
    # Add the date column to df2
    df2 <- cbind(df[, 1], df2)
    
    # We will use stringr for extracting company names to define column names
    library(stringr)
    
    colnames(df2) <- c("Date", str_extract(colnames(df[, ask_cols]), "([A-Za-z]+)"))
    

    给予

    > df2
             Date  A  C
    1  31/12/1999 NA NA
    2  03/01/2000 NA NA
    3  04/01/2000  5 NA
    4  05/01/2000  5 NA
    5  06/01/2000  5 NA
    6  07/01/2000  5 NA
    7  10/01/2000  5 NA
    8  11/01/2000  5 NA
    9  12/01/2000 NA NA
    10 13/01/2000 NA NA
    11 14/01/2000 NA  3
    12 17/01/2000 NA  3
    13 18/01/2000  3  3
    14 19/01/2000  5  3
    

    编辑:定义ask_cols和bid_cols的更好方法是使用 seq 函数

    ask_cols <- seq(2, ncol(df), 2)
    bid_cols <- seq(3, ncol(df), 2)
    

    编辑2:匹配公司名称的更好的正则表达式是使用前瞻匹配任何后跟.ASK的字符系列 .

    colnames(df2) <- c("Date", str_extract(colnames(df[, ask_cols]), ".*(?=\\.ASK)"))
    

相关问题