我想将A列复制到B列,但是对于A列的某些行,我希望在复制到B列时进行stringsplit更改。我可以不使用for循环执行此操作(即,我可以在dplyr中使用mutate执行此操作)?
我想分开':' (如果找到的话)并取strsplit的第二个元素并将其放入B中。
示例结果:
A B
1 a a
2 b b
3 c:d d
答案 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"