文字列の列を持つデータフレームがあり、それらの部分文字列を新しい列に抽出したい。
new_id
列を作成するために、id
列の最後の下線文字の後に文字列を取得することを示すサンプルコードとデータを次に示します。 id
列エントリには、常に2つのアンダースコア文字が含まれ、常に最終的なサブストリングになります。
df = data.frame( id = I(c("abcd_123_ABC","abc_5234_NHYK")), x = c(1.0,2.0) )
require(dplyr)
df = df %>% dplyr::mutate(new_id = strsplit(id, split="_")[[1]][3])
Strsplitが各行に順番に作用することを期待していました。
ただし、new_id
列には各行にABC
のみが含まれていますが、行1にはABC
、行2にはNHYK
が必要です。失敗し、私が望むものを達成する方法?
stringr::str_extract
を使用できます:
library(stringr)
df %>%
dplyr::mutate(new_id = str_extract(id, "[^_]+$"))
#> id x new_id
#> 1 abcd_123_ABC 1 ABC
#> 2 abc_5234_NHYK 2 NHYK
正規表現では、are n't+
(否定_
)の1つ以上([^ ]
)に一致し、その後に文字列の終わり( $
)。
正規表現を使用せずにtidyverse
スタイルを維持する別の方法は、tidyr::separate()
を使用することです。注、これはデフォルトで入力列を削除します(remove=FALSE
それを防ぐため)。
## using your example data
df = data.frame( id = I(c("abcd_123_ABC","abc_5234_NHYK")), x = c(1.0,2.0) )
## separate knowing you will have three components
df %>% separate(id, c("first", "second", "new_id"), sep = "_") %>% select(-first, -second)
## returns
new_id x
1 ABC 1
2 NHYK 2
つかいます dplyr::rowwise
:
df %>% dplyr::rowwise() %>% dplyr::mutate(new_id = strsplit(id, split="_")[[1]][3])
さらに別の選択肢については、ここで説明します。
http://www.expressivecode.org/2014/12/17/mutating-using-functions-in-dplyr/
strsplit
を一般的な方法で使用して、探していることを行う1つの方法を次に示します。
library(dplyr)
df = data.frame( id = I(c("abcd_123_ABC","abc_5234_NHYK")), x = c(1.0,2.0) )
temp <- seq(from=3, by=3, length.out = length(df))
dfn <- df %>% dplyr::mutate(new_id = unlist(strsplit(id, split="_"))[temp])
> dfn
id x new_id
1 abcd_123_ABC 1 ABC
2 abc_5234_NHYK 2 NHYK