1

我有以下数据框(df1):

someName    someMOD someValue   someID  someSymbol
FGR8    A(P);A(Z);M(O),A(Z),P(L)    4234    1   X
MZ66    C(P),M(O);M(O),A(Z),P(L)    434 23  Y
O161    A(P);A(Z);M(O),A(Z),P(L)    23  32  Z
O001    A(P),A(Z);M(O),A(P);M(O)    5   5   W
O0019   Z(P);A(Z),M(O),A(Z),Z(P)    34345   3   K

我想将 someMOD 列拆分为 ',' 然后 ';' ...然后删除重复的值并用逗号将字符串放回原处。我认为首先我们将 unlist 与 strsplit 一起使用,然后再次与分号分隔符一起使用,然后删除重复项,但如何用逗号将其放回原处?

semicolony <-  unlist(strsplit(df1$someMOD,','))
commay <- unlist(strsplit(semicolony$someMOD,';'))
commay <- commay[!duplicated(commay[,1]),]
commay = paste(commay, collapse=',')

期望的输出

someName    someMOD someValue   someID  someSymbol
FGR8    A(P),A(Z),M(O),P(L) 4234    1   X
MZ66    C(P),M(O),A(Z),P(L) 434 23  Y
O161    A(P),A(Z),M(O),P(L) 23  32  Z
O001    A(P),A(Z),M(O)  5   5   W
O0019   Z(P),A(Z),M(O)  34345   3   K

非常感谢任何帮助。

4

2 回答 2

3
x <- df1$someMOD
x2 <- strsplit(x, ",")
x3 <- lapply(x2,FUN=function(x) unlist(strsplit(x,";")))
x4 <- lapply(x3, unique)
x5 <- unlist(lapply(x4,paste,collapse=","))

我应该提到这可以组合成更少的步骤以避免重复lapply's,但想要遵循原始问题中的步骤(主要问题是最初使用unlist)。

于 2013-06-07T06:15:26.887 回答
2

尝试类似:

SplitFunction <- function(x) {
  b <- unlist(strsplit(x, '[;,]'))
  c <- b[!duplicated(b)]
  return(paste(c, collapse=","))
}

SplitFunctionV <- Vectorize(SplitFunction)
df$someMOD <- SplitFunctionV(df$someMOD)
于 2013-06-07T06:45:07.460 回答