修改R中数据框的内容

时间:2010-11-30 18:32:22

标签: r dataframe transform

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

        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

我想转换/修改为这样的另一个数据帧,我将“bin”列(第一行)的内容拆分为包含相同值的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...

任何帮助非常感谢,

3 个答案:

答案 0 :(得分:2)

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

data.frame(chr =“2L”,pos = 1:(150 * NROW(df1)),pval = rep(df1 $ pval,每个= 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) )

答案 1 :(得分:0)

这是尝试更广泛的答案,可以提高效率。我找不到一种简单的方法,可以将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)]

答案 2 :(得分:0)

使用stringsAsFactors = FALSE导入Firs以便不获取因子(或使用Chase answer转换为字符):

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
...