【问题标题】:Split character in column and name在列和名称中拆分字符
【发布时间】:2011-11-01 20:55:08
【问题描述】:

我想分割字符。虽然我有一个大的数据框要工作,但下面的小例子展示了需要做什么。

  mydf <- data.frame (name = c("L1", "L2", "L3"), 
    M1 = c("AC", "AT", NA), M2 = c("CC", "--", "TC"), M3 = c("AT", "TT", "AG"))

我想拆分变量 M1 到 M3 的字符(在实际数据集中我有 > 6000 个变量)

  name  M1a M1b   M2a M2b  M3a  M3b 
   L1   A    C    C    C    A     T
   L2   A    T    -    -    T     T
   L3   NA   NA   T     C    A     G

我尝试了以下代码:

func<- function(x) {sapply( strsplit(x, ""),
                     match, table= c("A","C","T","G", "--", NA))}

odataframe <- data.frame(apply(mydf, 1, func) )
colnames(odataframe) <-  paste(rep(names(mydf), each = 2), c("a", "b"), sep = "")
odataframe

【问题讨论】:

    标签: r split dataframe


    【解决方案1】:

    给你:

    splitCol <- function(x){
      x <- as.character(x)
      x[is.na(x)] <- "$$"
      z <- matrix(unlist(strsplit(x, split="")), ncol=2, byrow=TRUE)
      z[z=="$"] <- NA
      z
    }
    
    
    newdf <- as.data.frame(do.call(cbind, lapply(mydf[, -1], splitCol)))
    names(newdf) <- paste(rep(names(mydf[, -1]), each=2), c("a", "b"), sep="")
    newdf <- data.frame(mydf[, 1, drop=FALSE], newdf)
    
    newdf
      name  M1a  M1b M2a M2b M3a M3b
    1   L1    A    C   C   C   A   T
    2   L2    A    T   -   -   T   T
    3   L3 <NA>  <NA   T   C   A   G
    

    【讨论】:

    • 感谢您的及时回复,很高兴仍然可以处理 M1a 中的 NA 和第三行中的 M1b 应该是 NA 和 NA(不是 NA 和 A)
    • 我在您发表评论前几秒钟修复了这个问题。请重试。
    • 这可能非常适用于我。感谢您发布。我将它组合成一个函数,并认为我会分享。感谢您的帖子。
    【解决方案2】:

    Andrie 的代码作为可复制函数

    splitCol <- function(dataframe, splitVars=names(dataframe)){
    split.DF <- dataframe[,splitVars]
    keep.DF <- dataframe[, !names(dataframe) %in% c(splitVars)]
    
    X <- function(x)matrix(unlist(strsplit(as.character(x), split="")), ncol=2, byrow=TRUE)
    
    newdf <- as.data.frame(do.call(cbind, suppressWarnings(lapply(split.DF, X))) )
    names(newdf) <- paste(rep(names(split.DF), each=2), c(".a", ".b"), sep="") 
    data.frame(keep.DF,newdf)
    }
    

    测试一下

    splitCol(mydf)
    splitCol(mydf, c('M1','M2'))
    

    请不要将此选为正确答案。 Andrie 的答案显然是第一个正确答案。这只是他的代码对更多情况的扩展。感谢您提出问题并感谢 Andrie 提供的代码。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-12-22
      • 2020-03-24
      • 2020-11-15
      • 2013-02-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多