2016-05-12 5 views
0

列Aを列Bにコピーしたいが、列Aの特定の行については、列分割Bを列Bにコピーするときに文字列分割を変更したい。forループを使用せずにこれを行うことはできますか?これはdplyrでmutateを使用しています)?Rの列Aの行を列Bに条件付きでコピーできますか?

私が分割したい

:(見つかった場合)とstrsplitの第二の要素を取り、

B.

にサンプル結果にそれを置く '':おそらく

A B 
1 a a 
2 b b 
3 c:d d 
+3

あなたは確かにループなしで行うことができます。分割したい行を特定するためにAに適用するルールと、望ましい出力例をいくつか提供することができれば役に立ちます。 –

+1

'dput(your_data)'を試して、結果をあなたの質問に貼り付けてください。 –

+0

いくつかの編集を行いました。より明確にする必要がある場合はお知らせください。 –

答えて

1

dfrm$B[grepl("[:]", dfrm$A)] <- 
      sapply(strsplit(as.character(dfrm$A)[grepl("[:]", dfrm$A)], split="[:]"), "[", 2) 

Aが ":"を持つB個のアイテムだけを置き換え、同じ行のAアイテムが正規表現の文字クラスに分割されているときに形成されるリストの2番目のアイテムと置き換えます":"文字のみを入力します。

2

これは正直dplyrのような大きな銃を必要としない、我々は列Aを分割し、あなたがlapply機能使用することができ、結果の

DF = read.table(text="A B 
    a a 
    b b 
c:d d",header=TRUE,stringsAsFactors=FALSE) 


DF$NewCol=do.call(rbind,lapply(DF[,"A"],function(x) { z=unlist(strsplit(x,":")); z[length(z)] })) 
DF 
# A B NewCol 
# a a  a 
# b b  b 
#c:d d  d 
2

を最後の要素を取る:シンプルなビートに

DF = read.table(text="A B 
    a a 
    b b 
c:d d",header=TRUE,stringsAsFactors=FALSE) 

DF$NewCol<-do.call(rbind,lapply(strsplit(DF [,'A'],split=":"), function(x) tail(x,1))) 

DF 
    A B NewCol 
1 a a  a 
2 b b  b 
3 c:d d  d 
2

ハードをここの正規表現:

df$B = sub('.*:', '', df$A) 
1

str_extract

library(stringr) 
df1$B <- str_extract(df1$A, "\\w$") 
df1$B 
#[1] "a" "b" "d"