【问题标题】:order while splitting (eg. TA should be split to two column "A" in first "T" second) in r拆分时的顺序(例如,TA 应该在第一个“T”第二个中拆分为两列“A”)在 r
【发布时间】:2012-07-26 16:14:51
【问题描述】:

我有以下问题,我可以解决:

set.seed (1234)
mydf <- data.frame (var1a = sample (c("TA", "AA", "TT"), 5, replace = TRUE),
                    varb2 = sample (c("GA", "AA", "GG"), 5, replace = TRUE),
                    varAB = sample (c("AC", "AA", "CC"), 5, replace = TRUE)
                    )
     mydf 

  var1a varb2 varAB
1    TA    AA    CC
2    AA    GA    AA
3    AA    GA    AC
4    AA    AA    CC
5    TT    AA    AC

我想把两个字母分成不同的列,然后按字母顺序排列。

编辑:可以在拆分之前进行排序,例如 var1a 值“TA” var1a 应该是“AT”或拆分之后,以便 var1aa 应该是“A”,而 var1ab 应该是“T”(而不是“T”, “一种”)。 所以排序是在每个单元格内。

split_col <- function(.col, data){
    .x <- colsplit( data[[.col]], names =  paste0(.col, letters[1:2]))
   }

拆分每一列并合并

    require(reshape)
    splitdf <- do.call(cbind, lapply(names(mydf), split_col, data = mydf))

 var1aa var1ab varb2a varb2b varABa varABb
1      T      A      A      A      C      C
2      A      A      G      A      A      A
3      A      A      G      A      A      C
4      A      A      A      A      C      C
5      T      T      A      A      A      C

但未解决的部分是我想对这对列进行排序,以便按字母顺序对列名“a”和列名“b”进行排序。因此预期的输出:

    var1aa var1ab varb2a varb2b varABa varABb
1      A      T      A      A      C      C
2      A      A      A      G      A      A
3      A      A      A      G      A      C
4      A      A      A      A      C      C
5      T      T      A      A      A      C

如何才能命令(每对变量的短)?

【问题讨论】:

  • 你的意思是每对列中的每一行都需要按字母顺序排列吗?如果是这种情况,您应该将该陈述添加到您的问题中,因为它非常不清楚。
  • 目前的问题是不连贯的。代码创建的数据框与您提供的示例不匹配。代码数据中只有 2 个“T”。此外,“按字母顺序”操作的性质尚不清楚。你想按第一列倒序排列吗
  • 你的split_col 函数给了我一个错误:Error in is.character(pattern) : 'pattern' is missing
  • @sebastian-c 检查您使用的是来自 reshape 的 colsplit,而不是 reshape2,反之亦然。
  • @joran 是的,每对列都需要是订单 - 这也可以在拆分之前完成,而不是“TA”将转换为“AT”,但拆分后它是相同的但在一对列中将有“T”和“A”,将是“A”、“T”,我正在更新问题

标签: r sorting split dataframe


【解决方案1】:
mylist <-as.list(mydf)

splits <- lapply(mylist, reshape::colsplit, names=c("a", "b"))
rowsort <- lapply(splits, function(x) t(apply(x, 1, sort)))
comb <- do.call(data.frame, rowsort)
comb

  var1a.1 var1a.2 varb2.1 varb2.2 varAB.a varAB.b
1       A       T       A       A       C       C
2       A       A       A       G       A       A
3       A       A       A       G       A       C
4       A       A       A       A       C       C
5       T       T       A       A       A       C

编辑: 如果名称很重要,您可以替换它们:

replaceNums <- function(x){
  .which <- regmatches(x, regexpr("[[:alnum:]]*(?=.)", x, perl=TRUE))
  stopifnot(length(x) %% 2 == 0) #checkstep
  paste0(.which, c("a", "b"))
}

names(comb) <- replaceNums(names(comb))
comb
  var1aa var1ab varb2a varb2b varABa varABb
1      A      T      A      A      C      C
2      A      A      A      G      A      A
3      A      A      A      G      A      C
4      A      A      A      A      C      C
5      T      T      A      A      A      C

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-02
    • 2014-04-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-22
    相关资源
    最近更新 更多