Добавить столбцы в кадр данных с помощью цикла for - PullRequest
0 голосов
/ 26 сентября 2018

У меня есть матрица data и list.Я хотел бы найти совпадения между каждым вектором в моем списке с именами строк в моей матрице, вычислить их среднее значение и добавить эти значения во фрейм данных df, а новый столбец фрейма данных будет иметь то же имя, что и имена каждого вектора всписок.Я сделал это вручную, но мне интересно, как я могу сделать это for loop способом с более эффективными кодами.

data <- matrix(runif(75, 5.0, 10), nrow = 15, ncol = 5)
rownames(data) <- paste0("GENE",1:15)

colnames(data) <- paste0("COL",1:5)
list <- list(n = c("GENE1","GENE2","GENE3"), s = c("GENE4", "GENE5","GENE6","GENE7"),b = c("GENE8","GENE10", "GENE12", "GENE15"))

df <- data.frame(row.names = colnames(data))
df$n <- matrixStats::rowMeans2(t(data[intersect(row.names(data),list$n),]))
df$s <- matrixStats::rowMeans2(t(data[intersect(row.names(data),list$s),]))
df$b <- matrixStats::rowMeans2(t(data[intersect(row.names(data),list$b),]))

1 Ответ

0 голосов
/ 26 сентября 2018

Если вы хотите оптимизировать вместо циклов, попробуйте lapply в базе R, где мы подгруппируем строки на основе rownames в каждом элементе списка, а затем принимаем среднее значение для каждого столбца, используя colMeans.

t(do.call("rbind", lapply(lst, function(x) 
                   colMeans(data[rownames(data) %in% x,]))))


#            n        s        b
#COL1 7.242129 7.667626 6.980115
#COL2 7.317233 6.297818 6.186642
#COL3 6.709917 7.061652 7.552923
#COL4 7.773472 6.741069 7.765780
#COL5 7.039789 6.584206 7.569894

данные

set.seed(1234)
data <- matrix(runif(75, 5.0, 10), nrow = 15, ncol = 5)
rownames(data) <- paste0("GENE",1:15)

colnames(data) <- paste0("COL",1:5)
lst <- list(n=c("GENE1","GENE2","GENE3"), s = c("GENE4", "GENE5","GENE6","GENE7"),
    b = c("GENE8","GENE10", "GENE12", "GENE15"))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...