[英]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 構建時打開正則表達式支持時才可用,但 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 后端到 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.