【问题标题】:How to apply a function for every row in data?如何为数据中的每一行应用一个函数?
【发布时间】:2014-04-02 14:07:13
【问题描述】:

我的数据:

> 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的每一行中找到一个峰值?

【问题讨论】:

  • “找到一个高峰”是什么意思?您提供的结构对应于一个字符矩阵。您可能希望除第一列之外的所有列都为numeric,因此一个好的开始是强制转换为数据框并更改数据类型:tbl.df <- as.data.frame(tbl, stringsAsFactors=FALSE); tbl.df[, -1] <- apply(tbl.df[, -1], 2, as.numeric)
  • 这是我要使用的函数(用于“找峰”):which(diff(sign(diff(Gene name - name of the row)))==-2)+1
  • 还是没明白你说的“找峰”是什么意思。试图从您的评论中推断,因为“基因名称”是一个字符串(无法轻易推断出数值),并且“行的名称”没有定义,但默认为整数 1 到 6。也许你可以走我们通过计算,如果不是在 R 代码中,那么在人类可读的数学中?例如,如果您将每一行视为一个单独的序列并且“峰值”与“最大值”相同,那么“a2p1u8”的峰值可能是第 2_15 列(值为 1.727598)。
  • 我相信 OP 希望将函数(返回“峰值”的索引)应用于数据的每一行。
  • 也许以下其中一项提供了您想要/需要的 apply(tbl.df[,-1], 1, function(rr) max(rr))apply(tbl.df[,-1], 1, function(rr) which.max(rr))colnames(tbl.df)[1+apply(tbl.df[,-1], 1, function(rr) which.max(rr))]

标签: r


【解决方案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

【讨论】:

  • 我注意到我的输出有 23 列,而输入有 24 列。这是由于两个 diff 调用,每个调用都将向量缩短一。不确定那个额外的列属于哪里。
  • 您知道我们可以做些什么来将第 24 列恢复到我的数据中吗?
  • 还有一条评论:。我已经注意到我们只是在左边添加了一列 0,但它应该是这样的。有时第一列中的数字可能比第二列中的数字高,这意味着存在一个峰值。你知道如何正确地做吗?也许我使用这种功能的假设是不正确的。
  • 我在左侧添加了零列,因为您的函数将单元格的索引返回到函数等于-2 的单元格的右侧。除非我误解了某些内容,否则这意味着最左边的列中不能有任何1
  • 如果您这样做,请确保您非常清楚“峰”的含义。给出一个小的示例数据集以及预期的输出。
猜你喜欢
  • 1970-01-01
  • 2018-10-29
  • 1970-01-01
  • 1970-01-01
  • 2011-04-08
  • 2019-06-12
  • 2018-06-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多