R 中使用 strsplit() 函数进行文本分割

问题描述 投票:0回答:2

如何使用

strsplit
在 R 中拆分文本字符串,然后复制并粘贴到列中?

我正在尝试在导入 Excel 文件后拆分文本字符串,并添加一个输出,即将拆分内容粘贴到新列上。

这是我到目前为止所拥有的:

> column_1<-head(sample_file,n=10)
> column_1
# A tibble: 10 x 13
   Name         Last PxChg `Px%Chg`    Vol `Volm%Chg`  OInt `OI%Chg` IVM   `IV%Chg`   Ntnl
   <chr>       <dbl> <chr> <chr>     <dbl> <chr>      <dbl> <chr>    <chr> <chr>     <dbl>
 1 TSLA US 1~   1.49 -0.31 -17.22   172122 34.24      46048 3.37     41.9~ 5.39     4.12e9
 2 TSLA US 1~   0.62 -0.23 -27.06   157765 31.17      30183 19.71    43.8~ 7.5      3.78e9
 3 TSLA US 1~   3.75 -0.95 -20.21   139902 68.69      14796 52.33    40.6~ 6.17     3.35e9
 4 TSLA US 1~   0.98 -0.27 -21.6    110129 120.77     21548 0.72     42.6~ 7.06     2.64e9
 5 TSLA US 1~   5.23 -0.87 -14.26    88546 200.2       3878 96.26    40.9~ 3.49     2.12e9
 6 AAPL US 1~   0.27 -0.45 -62.5     87678 -16.01000~ 26170 16.8     16.3~ 5.61     1.69e9
 7 TSLA US 0~ 209.   -2    -0.95     74870 143.56      2103 0        N.A.  N.A.     1.79e9
 8 TSLA US 1~   2.22 -0.43 -16.23    71601 15.07      10345 17.3999~ 41.3~ 5.93     1.71e9
 9 TSLA US 0~ 176.   -1.5  -0.84     69740 166.28      2090 0        N.A.  N.A.     1.67e9
10 AMC US 12~   0.02 -0.03 -60       68632 1371.53    69467 0.97     168.~ 2.76     4.66e7

> column_1[1]
# A tibble: 10 x 1
   Name                           
   <chr>                          
 1 TSLA US 12/08/23 C245 Equity   
 2 TSLA US 12/08/23 C250 Equity   
 3 TSLA US 12/08/23 P240 Equity   
 4 TSLA US 12/08/23 C247.5 Equity 
 5 TSLA US 12/08/23 P242.5 Equity 
 6 AAPL US 12/08/23 C195 Equity   
 7 TSLA US 01/19/24 P450 Equity   
 8 TSLA US 12/08/23 C242.5 Equity 
 9 TSLA US 01/19/24 P416.67 Equity
10 AMC US 12/08/23 C9 Equity 

不完全确定将数据转换为数据帧格式是否有帮助,但以防万一。

> df1<-as.data.frame(column_1[1])
> df1
                              Name
1     TSLA US 12/08/23 C245 Equity
2     TSLA US 12/08/23 C250 Equity
3     TSLA US 12/08/23 P240 Equity
4   TSLA US 12/08/23 C247.5 Equity
5   TSLA US 12/08/23 P242.5 Equity
6     AAPL US 12/08/23 C195 Equity
7     TSLA US 01/19/24 P450 Equity
8   TSLA US 12/08/23 C242.5 Equity
9  TSLA US 01/19/24 P416.67 Equity
10       AMC US 12/08/23 C9 Equity

通过使用

strsplit
,如何获得如下所示的所需输出?

A 列[名称] 基本上包含股票代码、到期日、执行价格和期权类型(看涨/看跌),我想按部分拆分 A 列并添加到新列,如图所示。

非常感谢您的帮助。

r split
2个回答
2
投票

我认为

strsplit
是错误的工具。试试
tidyr::separate

tidyr::separate(df1, Name, c('symbol', 'country', 'date', 'code', 'type'), ' ')
#>    symbol country     date    code   type
#> 1    TSLA      US 12/08/23    C245 Equity
#> 2    TSLA      US 12/08/23    C250 Equity
#> 3    TSLA      US 12/08/23    P240 Equity
#> 4    TSLA      US 12/08/23  C247.5 Equity
#> 5    TSLA      US 12/08/23  P242.5 Equity
#> 6    AAPL      US 12/08/23    C195 Equity
#> 7    TSLA      US 01/19/24    P450 Equity
#> 8    TSLA      US 12/08/23  C242.5 Equity
#> 9    TSLA      US 01/19/24 P416.67 Equity
#> 10    AMC      US 12/08/23      C9 Equity

从问题中获取的可重复数据

df1 <- structure(list(Name = c(
"TSLA US 12/08/23 C245 Equity", 
"TSLA US 12/08/23 C250 Equity", 
"TSLA US 12/08/23 P240 Equity", 
"TSLA US 12/08/23 C247.5 Equity", 
"TSLA US 12/08/23 P242.5 Equity", 
"AAPL US 12/08/23 C195 Equity", 
"TSLA US 01/19/24 P450 Equity", 
"TSLA US 12/08/23 C242.5 Equity", 
"TSLA US 01/19/24 P416.67 Equity", 
"AMC US 12/08/23 C9 Equity"
)), class = "data.frame", row.names = c(NA, -10L))

1
投票

您可以结合使用

separate_wider_delim
和其他一些
dplyr
选项来获得您确切想要的输出:

df %>% separate_wider_delim(Name, 
                            delim = " ",
                            names = c("stock", "country", "expiry", "strike_price", "equity"),
                            cols_remove = FALSE) %>%
  mutate(option_type = gsub("\\d+|\\.", "", strike_price)) %>%
  select(-c(country, equity))

输出:

#                               Name stock expiry strike_price option_type
# 1     TSLA US 12/08/23 C245 Equity  TSLA 12/08/23         C245           C
# 2     TSLA US 12/08/23 C250 Equity  TSLA 12/08/23         C250           C
# 3     TSLA US 12/08/23 P240 Equity  TSLA 12/08/23         P240           P
# 4   TSLA US 12/08/23 C247.5 Equity  TSLA 12/08/23       C247.5           C
# 5   TSLA US 12/08/23 P242.5 Equity  TSLA 12/08/23       P242.5           P
# 6     AAPL US 12/08/23 C195 Equity  AAPL 12/08/23         C195           C
# 7     TSLA US 01/19/24 P450 Equity  TSLA 01/19/24         P450           P
# 8   TSLA US 12/08/23 C242.5 Equity  TSLA 12/08/23       C242.5           C
# 9  TSLA US 01/19/24 P416.67 Equity  TSLA 01/19/24      P416.67           P
# 10       AMC US 12/08/23 C9 Equity   AMC 12/08/23           C9           C
© www.soinside.com 2019 - 2024. All rights reserved.