簡體   English   中英

使用不穩定的數據格式拆分 R 中的列

[英]Split a column in R with inconstant data format

我有一個有 17 列的 R dataframe。 一列包含我將用於與其他數據框合並的唯一標識符。 但是,此列中的某些行包含額外的數據,導致無法合並。 這是我正在查看的不同類型數據的子集。

M2017013708-MN-M02199-180405
M201701492756-MN-M05144-180419
M2016019446_S3_L001
M2016019762

-MN 之后的所有數據都被認為是需要刪除的額外數據。 我的目標是在沒有額外數據的情況下向 dataframe 添加一個新列。 它看起來像這樣:

M2017013708
M201701492756
M2016019446_S3_L001
M2016019762

我試圖在 -MN 處拆分數據,該列表創建一個列表,然后使用 ldply 將其放入 dataframe 中。 但是,這會導致錯誤,因為拆分會導致多個長度的列表,因為並非所有行都有 -MN。

split_my_data <- strsplit(my_data$sample_name, '-MN')
df <- ldply(split_my_data)

我嘗試使用帶有 sql 和 sqldf 的 case 和正則表達式。 但是,我收到沒有這樣的 function REGEXP 的錯誤。

任何幫助將不勝感激。

或者您可以使用Look Beind Regex (?<=)嘗試此方法

df <- data.frame(OBS = 1:4, 
                 CODE = c("M2017013708-MN-M02199-180405",
                             "M201701492756-MN-M05144-180419",
                             "M2016019446_S3_L001",
                             "M2016019762"))
df2 <- df %>% 
  mutate(CODE2 = str_replace_all(CODE, regex("(?<=)-MN.*"), ""))
# OBS                           CODE               CODE2
# 1   1   M2017013708-MN-M02199-180405         M2017013708
# 2   2 M201701492756-MN-M05144-180419       M201701492756
# 3   3            M2016019446_S3_L001 M2016019446_S3_L001
# 4   4                    M2016019762         M2016019762

一個簡單整潔的解決方案也可以是:

library(dplyr)
library(stringr)

data <- tibble(dirty = c('M2017013708-MN-M02199-180405',
                         'M201701492756-MN-M05144-180419',
                         'M2016019446_S3_L001',
                         'M2016019762'))

data %>%
  mutate(clean = str_remove(dirty, pattern = '-MN.*'))

# A tibble: 4 x 2
  dirty                          clean              
  <chr>                          <chr>              
1 M2017013708-MN-M02199-180405   M2017013708        
2 M201701492756-MN-M05144-180419 M201701492756      
3 M2016019446_S3_L001            M2016019446_S3_L001
4 M2016019762                    M2016019762 

SQLite

關於 SQLite,正則表達式只有在 SQLite 構建時打開正則表達式支持時才可用,但 RSQLite 沒有這樣做,因此它不可用。

您可以做的是 append -MN-到每個字符串的末尾,以確保始終至少出現一次,然后使用instr搜索它並使用 substring 到該點使用substr

library(sqldf)
sqldf("select V1, substr(V1, 1, instr(V1 || '-MN-', '-MN-') - 1) as V2 from DF")

給予:

                              V1                  V2
1   M2017013708-MN-M02199-180405         M2017013708
2 M201701492756-MN-M05144-180419       M201701492756
3            M2016019446_S3_L001 M2016019446_S3_L001
4                    M2016019762         M2016019762

H2

如果我們使用 H2 后端到 sqldf 而不是 SQLite 那么我們可以使用正則表達式。 RH2 package 包括 R 驅動程序和 H2 本身,如果加載了 sqldf 將假定您想使用它而不是 Z497757A9C5B2EC17DED656170B51C788。 加載 RH2 和 sqldf 的順序無關緊要。

library(RH2)
library(sqldf)

sqldf("select V1, regexp_replace(V1, '-MN-.*', '') as V2 from DF")

筆記

可重現形式的輸入是:

DF <- data.frame(V1 = c("M2017013708-MN-M02199-180405",
                        "M201701492756-MN-M05144-180419",
                        "M2016019446_S3_L001",
                        "M2016019762"))

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM