web-dev-qa-db-ja.com

dplyr mutateと既存の列の部分文字列で新しい列を作成します

文字列の列を持つデータフレームがあり、それらの部分文字列を新しい列に抽出したい。

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が必要です。失敗し、私が望むものを達成する方法?

15
PM.

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つ以上([^ ])に一致し、その後に文字列の終わり( $)。

17
Sam Firke

正規表現を使用せずに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
9
vincentmajor

つかいます 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/

8
Philipp Merkle

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
1
Lloyd Christmas