首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在相同的数据中减去两列,在R中有相同的列标题/名称,缺少数据

如何在相同的数据中减去两列,在R中有相同的列标题/名称,缺少数据
EN

Stack Overflow用户
提问于 2016-01-02 10:21:24
回答 1查看 1.1K关注 0票数 1

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

代码语言:javascript
复制
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

df1 2<-df1 1

代码语言:javascript
复制
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

我们非常感谢你的帮助。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-01-02 11:13:09

有了格式良好的数据,在每一家公司的要价和出价之间交替,这使得这个相对简单。下面的代码应该可以执行您想要的操作。

代码语言:javascript
复制
# 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]+)"))

给予

代码语言:javascript
复制
> 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函数

代码语言:javascript
复制
ask_cols <- seq(2, ncol(df), 2)
bid_cols <- seq(3, ncol(df), 2)

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

代码语言:javascript
复制
colnames(df2) <- c("Date", str_extract(colnames(df[, ask_cols]), ".*(?=\\.ASK)"))
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34564800

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档