我想转换/修改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...
任何帮助非常感谢,
本
答案 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
...