如何在缺少数据的情况下减去 R 中具有相同列 headers/name 的同一数据框中的两列
How to subtract two columns in same dataframe with same columns headers/name in R with missing data
我有一个包含 8000 列和 3785 行的数据框。列是公司名称,因此,我想通过从出价中减去要价来计算公司的价差,即 company/stock = A.ASK- A.BID 的价差。 name 列中 A.ASK 表示 A 是公司名称,.ASK 表示是公司的 ASK 价格,.BID 是 A 的 BID 价格。在我的数据框中,公司的所有要价和出价都并排列,如下面的示例数据框所示。此外,我还缺少数据,例如,如果公司 C 在 2001 年开始交易,它将在 2000 年有 NA。因此,我想要的是不要忽略用于计算的日期列,此外还有公司的要价和出价的 NA return 结果列中的 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
非常感谢您的帮助
拥有在每家公司的要价和出价之间交替的格式良好的数据使得这相对简单。以下代码应该可以满足您的需求。
# 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)"))
我有一个包含 8000 列和 3785 行的数据框。列是公司名称,因此,我想通过从出价中减去要价来计算公司的价差,即 company/stock = A.ASK- A.BID 的价差。 name 列中 A.ASK 表示 A 是公司名称,.ASK 表示是公司的 ASK 价格,.BID 是 A 的 BID 价格。在我的数据框中,公司的所有要价和出价都并排列,如下面的示例数据框所示。此外,我还缺少数据,例如,如果公司 C 在 2001 年开始交易,它将在 2000 年有 NA。因此,我想要的是不要忽略用于计算的日期列,此外还有公司的要价和出价的 NA return 结果列中的 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
非常感谢您的帮助
拥有在每家公司的要价和出价之间交替的格式良好的数据使得这相对简单。以下代码应该可以满足您的需求。
# 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)"))