Изменить содержимое кадра данных в R - PullRequest
4 голосов
/ 30 ноября 2010

Я хотел бы преобразовать / изменить содержимое 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

И я хотел бы преобразовать / изменить в другой фрейм данных, как это, где я разделил содержимое моего столбца "бункеров" (первая строка) на 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 ]

2 голосов
/ 30 ноября 2010

Быстрый ответ, который, боюсь, может быть слишком конкретным и, возможно, нуждается в обобщении.Предположим, что первый кадр данных называется «df1»:

data.frame (chr = "2L", pos = 1: (150 * NROW (df1)), pval = rep (df1 $ pval, каждый = 150))

Переработка аргументов должна сделать "chr" достаточно длинным без функции повторения.

Редактировать в ответ на комментарий.Если длина повторения всегда равна 150, то исправить легко:

data.frame(chr = rep(substr(df1$bins, 1,2), each=150), 
           pos = 1:(150*NROW(df1)), 
           pval = rep(df1$pval, each=150) )
0 голосов
/ 01 декабря 2010

Первый импорт с 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
...
0 голосов
/ 30 ноября 2010

Вот попытка получить более обобщенный ответ, который можно сделать более эффективным. Я не смог найти простой способ конвертировать из 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)]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...