如何为数据中的每一行应用函数?

时间:2014-04-02 14:07:13

标签: r

我的数据:

> dput(head(tbl))
structure(c("a2p1u8", "a2qab2", "a6zl23", "a6zlf3", "a6zq61", 
"a6ztx1", "0", "0", "0", "0", "0.9339597", "0", "0", "0", "0", 
"0", "14.2445924", "0", "0", "0", "0", "0", " 1.84391660", "0", 
"0", "0", "0", "0", "1.00000000", "0", "0", "0", "0", "0", "0.85034470", 
"0", "0.06312408", "0", "0", "1.11684073", "1.00000000", "1.29478436", 
"0.135377134", "0", "0", "0.941579636", "0.389199799", "0.705215641", 
"0.34063483", "0", "0", "1.00000000", "0.46785766", "0", "1.43325438", 
"0", "0", "0", "0.15782118", "0", "1.71425096", "0", "0", "0", 
"0.38274080", "0", " 0.71553232", "0", "0", "0", "0", "0", "0", 
"0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", 
"0", "0", "0", "0", "1.72759758", "0", "0", "0", "0", "0", "1.712898580", 
"0", "0", "0", "0", "0", "0.74788829", "1.00000000", "0", "0", 
"0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", 
"0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", 
"0", "0", "0", "0", "0", "0", "0", "0", "1.29452015", "0", "0", 
"0", "0", "0", "0.85273992", "0", "0", "0"), .Dim = c(6L, 25L
), .Dimnames = list(NULL, c("Gene name", "2_1", "2_2", "2_3", 
"2_4", "2_5", "2_6", "2_7", "2_8", "2_9", "2_10", "2_11", "2_12", 
"2_13", "2_14", "2_15", "2_16", "2_17", "2_18", "2_19", "2_20", 
"2_21", "2_22", "2_23", "2_24")))

作为输出,我想获得一个新的data.frame / matrix,其行数和列数相同,并且单元格中的数字为1,此函数找到一个峰值。

which(diff(sign(diff(Gene name)))==-2)+1

如何在data.frame的每一行中找到一个峰值?

1 个答案:

答案 0 :(得分:1)

您尝试做的事情可能最容易使用数字矩阵,因此我们将获取基因名称并将其存储为行名称,我们将删除基因列。然后我们添加行名称并将矩阵强制转换为数字(最后一步应该逐列完成,即apply函数在第二维上as.numeric

nm <- tbl[, 1]
tbl <- apply(tbl[, -1], 2, as.numeric)
row.names(tbl) <- nm

现在我们可以创建一个二进制指示符矩阵,显示diff(sign(diff(x)))是否等于-2。我们通过将您的函数(稍加修改,删除which调用以确保它返回所需维度的矩阵)应用于tbl的第一维(行)来完成此操作。

minus2 <- t(apply(tbl, 1, function(x) as.numeric(diff(sign(diff(x)))==-2)))

我们希望列在-2的列的右侧,因此我们可以cbind左侧的一列零minus2

peaks <- cbind(0, minus2)

这会产生:

peaks

#        [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11] [,12] [,13] [,14] [,15] [,16] [,17] [,18] [,19] [,20] [,21] [,22] [,23]
# a2p1u8    0    0    0    0    0    0    0    0    0     1     0     0     0     0     1     0     0     0     0     0     0     0     0
# a2qab2    0    0    0    0    0    0    0    0    0     0     0     0     0     0     0     0     1     0     0     0     0     0     0
# a6zl23    0    0    0    0    0    0    0    0    0     0     0     0     0     0     0     0     0     0     0     0     0     0     1
# a6zlf3    0    0    0    0    0    1    0    1    0     0     0     0     0     0     0     0     0     0     0     0     0     0     0
# a6zq61    0    1    0    0    0    1    0    1    0     1     0     0     0     0     0     0     0     0     0     0     0     0     0
# a6ztx1    0    0    0    0    0    1    0    0    0     0     0     0     0     0     0     0     0     0     0     0     0     0     0