web-dev-qa-db-ja.com

dplyrとmutateでstrsplitとサブセットを使用する

文字列列が1つあるデータテーブルがあります。 strsplitを使用して、この列のサブセットである別の列を作成したいと思います。

dat <- data.table(labels=c('a_1','b_2','c_3','d_4'))

私が欲しい出力は

label  sub_label
a_1    a
b_2    b
c_3    c
d_4    d 

私は以下を試しましたが、どちらもうまくいかないようです。

dat %>%
    mutate(
        sub_labels=strsplit(as.character(labels), "_")[[1]][1]
    ) 
# gives a column whose values are all "a"

これは私には理にかなっているようですが、

dat %>%
    mutate(
        sub_labels=sapply(strsplit(as.character(labels), "_"), function(x) x[[1]][1])
    )

エラーを出します

エラー:タイプのペアリストの処理方法がわかりません

Strsplitからの出力の貼り付けと折りたたみが機能する別の投稿を見たので、無名関数のサブセットが問題を引き起こしている理由がわかりません。これについての説明をありがとう。

10
chungkim271

tidyr::separate ここで助けることができます:

> dat %>% separate(labels, c("first", "second") )
   first second
1:     a      1
2:     b      2
3:     c      3
4:     d      4    
19
Romain Francois

別の方法では、purrrのmap_chrを使用します。これは、分離や結合に煩わされたくない(たとえば、他の文字列でsprintfの結果を使用する)アプリケーションに役立ちます。

tibble(labels=c('a_1','b_2','c_3','d_4')) %>% 
  mutate(sub_label = str_split(labels, "_") %>% map_chr(., 1))
1
GenesRus