我有一个数据框,我希望通过第一个“.”将一列(var)分成两列。var 中的值目前有 2 个句点。我想将新名称称为“第一”和“第二”。我已经添加了我的数据框以及它的屏幕截图。最后我展示了我的尝试。
df = structure(list(Date.Dates = c("42370", "42373", "42374", "42375",
"42376", "42377"), var = c("SHOP US Equity.30DAY_IMPVOL_100.0%MNY_DF",
"SHOP US Equity.30DAY_IMPVOL_100.0%MNY_DF", "SHOP US Equity.30DAY_IMPVOL_100.0%MNY_DF",
"SHOP US Equity.30DAY_IMPVOL_100.0%MNY_DF", "SHOP US Equity.30DAY_IMPVOL_100.0%MNY_DF",
"SHOP US Equity.30DAY_IMPVOL_100.0%MNY_DF"), val = c("59.835999999999999",
"67.208600000000004", "61.522599999999997", "63.298900000000003",
"66.243200000000002", "69.282899999999998")), row.names = c(NA,
-6L), class = c("tbl_df", "tbl", "data.frame"))
library(tidyverse)
df %>%
gather(var, val, -Date.Dates) %>%
separate(var, c("First", "Second", sep = "/^([^.]+)/"))
Run Code Online (Sandbox Code Playgroud)
我们应该有一个名为“First”的新列,其中包含值“SHOP US Equity”。名为“Second”的第二列包含值“30DAY_IMPVOL...”
谢谢
我们可以使用从字符串的开头 ( )extract将不是.( [^.]+)的字符捕获^为一组,然后是.( \\.) 和第二组中的其余字符作为“第二”列
library(dplyr)
library(tidyr)
df %>%
extract(var, into = c("First", "Second"), "^([^.]+)\\.(.*)")
Run Code Online (Sandbox Code Playgroud)
或者只是[.]用作sep. 它会分成两列并带有警告,因为有多个.,这将在第一次出现时拆分.
df %>%
separate(var, into = c("First", "Second"), "[.]")
# A tibble: 6 x 4
# Date.Dates First Second val
# <chr> <chr> <chr> <chr>
#1 42370 SHOP US Equity 30DAY_IMPVOL_100 59.835999999999999
#2 42373 SHOP US Equity 30DAY_IMPVOL_100 67.208600000000004
#3 42374 SHOP US Equity 30DAY_IMPVOL_100 61.522599999999997
#4 42375 SHOP US Equity 30DAY_IMPVOL_100 63.298900000000003
#5 42376 SHOP US Equity 30DAY_IMPVOL_100 66.243200000000002
#6 42377 SHOP US Equity 30DAY_IMPVOL_100 69.282899999999998
Run Code Online (Sandbox Code Playgroud)
如果我们不需要警告,另一种选择是使用正则表达式环视
df %>%
separate(var, into = c("First", "Second"), "(?<=[a-z])\\.(?=[0-9])")
Run Code Online (Sandbox Code Playgroud)
或使用 base R
df[c("First", "Second")] <- read.csv(text = sub("\\.", ",", df$var), header = FALSE)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
897 次 |
| 最近记录: |