【问题标题】:Modify the content of a dataframe in R在 R 中修改数据框的内容
【发布时间】:2011-05-18 01:26:15
【问题描述】:

我想转换/修改数据框的内容。基本上我有一个如下的数据框:

        bins      pval
1   2L:1:150 0.9224217
2 2L:151:300 0.9478824
3 2L:301:450 0.9671139
4 2L:451:600 0.9280847
5 2L:601:750 0.9698584
6 2L:751:900 0.9725379

我想转换/修改成另一个这样的数据框,我将“bins”列(第一行)的内容拆分为包含相同值的 150 行。第二行以此类推。

    chr  pos    pval
1   2L   1 0.9224217
2   2L   2 0.9224217
3   2L   3 0.9224217
4   2L   4 0.9224217
5   2L   5 0.9224217
...
150  2L   150 0.9224217
151  2L   151 0.9478824
152  2L   152 0.9478824
153  2L   153 0.9478824
etc...

非常感谢任何帮助,

【问题讨论】:

    标签: r dataframe transform


    【解决方案1】:

    我担心,快速回答可能过于具体,可能需要概括。假设第一个数据帧名为“df1”:

    data.frame(chr="2L", pos=1:(150*NROW(df1)), pval=rep(df1$pval, each=150))

    参数回收应该使“chr”足够长而不需要rep函数。

    编辑以回复评论。如果重复长度始终为 150,则修复很简单:

    data.frame(chr = rep(substr(df1$bins, 1,2), each=150), 
               pos = 1:(150*NROW(df1)), 
               pval = rep(df1$pval, each=150) )
    

    【讨论】:

    • 如果“chr”始终为“2L”,这将起作用,但是我确实有 3R:1:150、4L:1:150 等垃圾箱......所以列 'chr ' 不是常数。
    • 这在大约 2 或 3 分钟内完美运行,data.frame 有 100 万行。谢谢。
    【解决方案2】:

    这是一个更通用的答案尝试,可以提高效率。我找不到一种简单的方法来从factor 转换为numeric,同时保留新的numeric 列中的级别。无论如何,这应该可以工作并且可以支持“chr”列的不同值和不同的行数:

    library(plyr)
    
    df <- read.table(textConnection("        bins      pval
    1   2L:1:150 0.9224217
    2 2L:151:300 0.9478824
    3 2L:301:450 0.9671139
    4 2L:451:600 0.9280847
    5 2L:601:750 0.9698584
    6 2L:751:900 0.9725379
    "), header = TRUE)
    
    #Split bins
    df.split <- data.frame(matrix(unlist(strsplit(as.character(df$bins), ":")), ncol = 3, byrow = TRUE ))
    
    colnames(df.split) <- c("chr", "low", "high")
    
    df.split$low <- as.numeric(as.character(df.split$low))
    df.split$high <- as.numeric(as.character(df.split$high))
    
    #Attach the pval from original df
    df.split$pval <- df[, 2]
    
    df.new <- adply(df.split, 1, summarise, pos = (low - 1) + seq(low:high))
    df.new <- df.new[, c(1, 5, 4)]
    

    【讨论】:

    • 数字强制的正确因素是 R-FAQ:num
    • @Dwin - 这确实简单多了!
    • 我已经用包含超过 100 万行的 data.frame 测试了这段代码,它仍在运行......
    • @Benoit - 如果你总是知道你在重复 150 倍,那么 DWin 的答案会更快。我会更深入地了解需要这么长时间的原因,我想这是对adply的调用@
    【解决方案3】:

    首先使用 stringsAsFactors = FALSE 导入,以免获取因子(或使用 Chase 答案转换为字符):

    df <- read.table(textConnection("        bins      pval
    1   2L:1:150 0.9224217
    2 2L:151:300 0.9478824
    3 2L:301:450 0.9671139
    4 2L:451:600 0.9280847
    5 2L:601:750 0.9698584
    6 2L:751:900 0.9725379
    "), header = TRUE, stringsAsFactors = FALSE)
    

    现在,剩下的:

    split <- strsplit(df$bins, ":")
    df$chr <- sapply(split, "[[", 1)
    reps <- sapply(split, function(el) diff(as.numeric(el[2:3]))+1) 
    df[rep(1:nrow(df), reps), c("chr", "pval")] 
    
          chr      pval
    1      2L 0.9224217
    1.1    2L 0.9224217
    1.2    2L 0.9224217
    1.3    2L 0.9224217
    1.4    2L 0.9224217
    1.5    2L 0.9224217
    1.6    2L 0.9224217
    1.7    2L 0.9224217
    1.8    2L 0.9224217
    1.9    2L 0.9224217
    1.10   2L 0.9224217
    ...
    

    【讨论】:

      猜你喜欢
      • 2018-05-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-26
      • 1970-01-01
      相关资源
      最近更新 更多