2017-07-12 11 views
3

それらを貼り付ける:非公開にデータフレーム列とIは、データフレームを持って一緒に

df <- structure(list(ID = 1:19, MEDICATION = c("0", "NOVOMIX 26 BF, 20 D", 
               "NOVOMIX 14 D", "NOVOMIX 34 BF 22 D", "MIXTARD 52 BF 20 D", "MIXTARD 40 BF 24 D", 
               "MIXTARD 10 BF 8 D", "MIXTARD 42 BF 24 D", "MIXTARD 20 BF 18 D", 
               "MIXTARD 82 BF 46 D", "MIXTARD 14 BF 10 D", "NOVOMIX 15 BF 15 D", 
               "MIXTARD", NA, "MIXTARD 10 BF 4 D", "NOVOMIX", "MIXTARD --> NOVOMIX", 
               "NOT GIVEN ANY DIABETES MEDICATION INPATIENT PATIENT NORMALLY ON METFORMIN", 
               "GIVEN ASPART")), class = c("tbl_df", "tbl", "data.frame"), row.names = c(NA, -19L), .Names = c("ID", "MEDICATION")) 

Iは、(すべての薬物を抽出したいすなわちNOVOMIXMIXTARD、データフレーム内のMEDICATION変数からMETFORMINASPART 。次のようにし、それらを貼り付け、私は私のコードを書いた:

library(tidyverse) 
library(rebus) 
df %>% 
     mutate(MEDICATION2 = str_extract_all(MEDICATION, pattern = 
          or1(c("NOVOMIX", "MIXTARD", "METFORMIN", "ASPART")))) %>% 
     unnest(MEDICATION2) %>% 
     group_by(ID) %>% 
     mutate(MEDICATION2 = str_c(unlist(MEDICATION2), collapse = " - ")) %>% 
     slice(1) 

私の予想される出力は次のようになります。

df_out <- structure(list(ID = c(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 
13, 14, 15, 16, 17, 18, 19), MEDICATION = c("0", "NOVOMIX 26 BF, 20 D", 
"NOVOMIX 14 D", "NOVOMIX 34 BF 22 D", "MIXTARD 52 BF 20 D", "MIXTARD 40 BF 24 D", 
"MIXTARD 10 BF 8 D", "MIXTARD 42 BF 24 D", "MIXTARD 20 BF 18 D", 
"MIXTARD 82 BF 46 D", "MIXTARD 14 BF 10 D", "NOVOMIX 15 BF 15 D", 
"MIXTARD", NA, "MIXTARD 10 BF 4 D", "NOVOMIX", "MIXTARD --> NOVOMIX", 
"NOT GIVEN ANY DIABETES MEDICATION INPATIENT PATIENT NORMALLY ON METFORMIN", 
"GIVEN ASPART"), MEDICATION2 = c(NA, "NOVOMIX", "NOVOMIX", "NOVOMIX", 
"MIXTARD", "MIXTARD", "MIXTARD", "MIXTARD", "MIXTARD", "MIXTARD", 
"MIXTARD", "NOVOMIX", "MIXTARD", NA, "MIXTARD", "NOVOMIX", "MIXTARD - NOVOMIX", 
"METFORMIN", "ASPART")), .Names = c("ID", "MEDICATION", "MEDICATION2" 
), row.names = c(NA, -19L), class = "data.frame") 

問題は、コードがMEDICATION == 0を持つ行を削除し、私は私のコードは、単純な文字列の抽出には長すぎると思います。私はあなたがこのコードは(可能であれば)短縮することができます方法を知っていれば助けを求めるしたいと思います。

+0

あなただけの 'sapply(C( "NOVOMIX"、 "MIXTARD"、 "メトホルミン"、 "アスパルト")のような何かを行うことができ、 grepl、X = DFの$薬) '4つのバイナリ列、各薬剤のための1を取得します。 – thelatemail

+0

@thelatemail私は、私が薬を抽出する間、私が保存したいと思っている他のカラムがあり、私はその薬のために1つの変数しか持たないことを望んでいます。 – HNSKD

答えて

4

私たちは、パターンに一致するすべての単語を抽出するためにstringiパッケージからstri_extract_all_regexを使用することができます。

library(stringi) 
med_pattern <- c("NOVOMIX|MIXTARD|METFORMIN|ASPART") 
df$MEDICATION2 <- stri_extract_all_regex(df$MEDICATION, pattern = med_pattern) 

@ mt1022で述べたように、新しい列はリストです。私たちは、しかし、それは1つの以上の要素とリストのためのいくつかの不要な文字を与えることはありません

df$MEDICATION2<-paste(stri_extract_all_regex(df$MEDICATION,pattern = med_pattern)) 

と一緒にそれらをpasteことがあります。これにより、期待される出力が得られます。

chars <- stri_extract_all_regex(df$MEDICATION, pattern = med_pattern) 
df$MEDICATION2 <- sapply(chars, paste, collapse = "-") 
df$MEDICATION2 

#[1] "NA"    "NOVOMIX"   "NOVOMIX"   "NOVOMIX"   
#[5] "MIXTARD"   "MIXTARD"   "MIXTARD"   "MIXTARD"   
#[9] "MIXTARD"   "MIXTARD"   "MIXTARD"   "NOVOMIX"   
#[13] "MIXTARD"   "NA"    "MIXTARD"   "NOVOMIX"   
#[17] "MIXTARD-NOVOMIX" "METFORMIN"  "ASPART" 

また、1つの行でこれを行うことができます。

df$MEDICATION2 <- sapply(stri_extract_all_regex(df$MEDICATION, 
         pattern = med_pattern), paste, collapse = "-") 
+0

新しい列はリストです。各リスト要素を一緒に '貼り付け 'たいと思うかもしれません。 – mt1022

+0

@ mt1022 right!ちょうど答えを更新しました。ありがとう:) –

関連する問題