【问题标题】:Reformatting data with a pattern使用模式重新格式化数据
【发布时间】:2011-11-14 21:20:31
【问题描述】:

我有一个混合了数字和字母的大型数据集。只是一个小例子:

sex <- c("M", "F", "F", "M", "M")
 ind <- c("I1", "I2", "I3", "I4", "C")
M1 <- c("ab", "bb", "ac", "ad", "dd")
M2 <- c(12, 22, 23, 24, 25)
M3 <- c("AT", "AG", "AC", "GG", "TC")
 M4 <- c(22, 23, 24, 14, 24)
mydf <- data.frame(sex, ind, M1, M2, M3, M4)
mydf
  sex ind M1 M2 M3 M4
1   M  I1 ab 12 AT 22
2   F  I2 bb 22 AG 23
3   F  I3 ac 23 AC 24
4   M  I4 ad 24 GG 14
5   M   C dd 25 TC 24

我想在 M1......Mn 列(文件末尾)的两个字符之间引入一个“/”标记,以便生成的数据框如下所示:

       sex ind M1 M2 M3 M4
    1   M  I1 a/b 1/2 A/T 2/2
    2   F  I2 b/b 2/2 A/G 2/3
    3   F  I3 a/c 2/3  A/C 2/4
    4   M  I4 a/d 2/4 G/G 1/4
    5   M   C d/d 2/5 T/C 2/4

抱歉,我不知道如何继续...感谢您的帮助...

【问题讨论】:

    标签: r dataframe reformat


    【解决方案1】:

    一个班轮:

    > data.frame(lapply(mydf, function(x) sub("(.)(.)", "\\1/\\2", x)))
      sex ind  M1  M2  M3  M4
    1   M I/1 a/b 1/2 A/T 2/2
    2   F I/2 b/b 2/2 A/G 2/3
    3   F I/3 a/c 2/3 A/C 2/4
    4   M I/4 a/d 2/4 G/G 1/4
    5   M   C d/d 2/5 T/C 2/4
    

    【讨论】:

    • 感谢苗条的解决方案,但我不打算应用于 ind 变量,所以我可以通过以下方式轻松删除它:data.frame(lapply(mydf[,3:length(mydf)], function(x ) sub("(.)(.)", "\\1/\\2", x)))
    【解决方案2】:

    R 的所有神秘力量都为您提供:

    • splitInsert 使用 strsplit 在每个字母处拆分一列,并将其与 paste 重新组合。这包含在 sapply 中以向量化函数。
    • 然后我使用lapplysplitInsert 应用于data.frame 的3:6 列,并使用data.frame 将其与您不想修改的两列结合起来。
    • 请注意,splitInsert 是完全通用的 - 它适用于任何长度的文本字符串,您可以使用任何新字符来重新组合拆分元素。

    代码:

    splitInsert <- function(x, split="", new="/"){
      sapply(x, function(y)
        paste(
          strsplit(as.character(y), split=split)[[1]], 
          collapse=new)
             )
    }
    
    data.frame(mydf[, 1:2], lapply(mydf[, 3:ncol(mydf)], splitInsert))
    

    结果:

      sex ind  M1  M2  M3  M4
    1   M  I1 a/b 1/2 A/T 2/2
    2   F  I2 b/b 2/2 A/G 2/3
    3   F  I3 a/c 2/3 A/C 2/4
    4   M  I4 a/d 2/4 G/G 1/4
    5   M   C d/d 2/5 T/C 2/4
    

    【讨论】:

      【解决方案3】:

      这似乎行得通。

      m1 <- substr(mydf$M1, start=1, stop=1)
      m2 <- substr(mydf$M1, start=2, stop=2)
      paste(m1, m2, sep="/")
      

      输出

      [1] "a/b" "b/b" "a/c" "a/d" "d/d"
      

      【讨论】:

      • 工作谢谢,但我需要创建一个函数,以便应用于整个数据帧,例如:varn
      猜你喜欢
      • 1970-01-01
      • 2012-01-19
      • 1970-01-01
      • 2018-11-25
      • 2016-07-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多