如何有条件地将R列中的A行复制到B列?

时间:2016-05-12 18:45:14

标签: r dplyr

我想将A列复制到B列,但是对于A列的某些行,我希望在复制到B列时进行stringsplit更改。我可以不使用for循环执行此操作(即,我可以在dplyr中使用mutate执行此操作)?

我想分开':' (如果找到的话)并取strsplit的第二个元素并将其放入B中。

示例结果:

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

5 个答案:

答案 0 :(得分: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

答案 1 :(得分: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 :(得分:2)

这里难以击败简单的正则表达式:

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

答案 3 :(得分:1)

也许:

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

翻译成英文,说明只替换A中有“:”的B项,并且当同一行中的A项在包含正则表达式的字符类中拆分时,形成的列表的第二项也是如此只有“:”字符。

答案 4 :(得分:1)

我们可以使用str_extract

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