2016-05-12 34 views
0

我想將列A複製到列B,但對於列A的某些行,我想在複製到列B時進行一次stringsplit更改。我可以在不使用for循環的情況下執行此操作(即,我可以執行此操作嗎這在dplyr中使用mutate)?如何有條件地將列A的行復制到R中的列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

此誠實並不需要大槍一樣dplyr,大家平分列A和拍攝效果的最後一個元素

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

你可以使用一個lapply功能:

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" 
相關問題