【问题标题】:select only rows if its value in a particular column is more than 5 times its value in the other colum如果特定列中的值大于另一列中的值的 5 倍,则仅选择行
【发布时间】:2017-01-11 00:21:21
【问题描述】:

我最近才开始学习 R,如果这是对某人的新手问题,请原谅我。我想从“Bladder”列中提取该行,该行的值是其他列的 5 倍以上。

gene     Adrenal    Amygdala    Bladder BoneMarrow
1007_s_at   10.46973369 11.26483864 100.43303178    9.907426976
1053_at 6.446570421 6.462840464 6.570665594 7.068326351
117_at  8.018137441 7.738652705 7.604989675 8.38937883
121_at  10.78168853 10.3223056  10.38043102 10.73936285
1255_g_at   5.625038847 6.132930765 5.526885199 5.448521716
1294_at 8.37142904  8.1019947   8.549260758 8.697436419
1316_at 6.237386633 6.429011484 6.083330287 6.295933456
1320_at 6.206410651 6.139873183 6.328348899 6.251521738
1405_i_at   6.588370219 5.949622255 7.420451672 8.823058974

预期结果

gene     Adrenal    Amygdala    Bladder BoneMarrow
1007_s_at   10.46973369 11.26483864 100.43303178    9.907426976

我得到这个答案很有用,但我不知道如何申请多个列 select only rows if its value in a particular column is less than its value in the other column

谢谢。

【问题讨论】:

  • 鉴于上面的数据框,你能发布预期的结果吗?
  • “与其他列相比高出 5 倍以上”。这种说法相当模棱两可。比 any 其他列或 all 其他列高 5 倍?
  • dplyr::filter(your_data, Blatter > 5*(column_you_are_talking_about))。如果您有多个条件,只需添加多个参数以过滤以包含这些条件。例如,. Blatter > 5*other_column_you_are_talking_about
  • 照原样,您发布的数据没有出现 Bladder 大于任何或所有其他列的 5 倍的示例。请修复该问题,然后发布预期结果。此外,您可能想要命名第一列。
  • @pali: 抱歉,您的意思是将 100.46973369 值更改为 Bladder 而不是 Adrenal?否则,您的条件是返回除 Bladder 之外的任何列大于 5 * Bladder 的行。

标签: r


【解决方案1】:

这个问题问得不是很好,所以我的回答可能不是你所期望的,但我认为你想要得到的东西很重要而且很简单。我的示例使用了dplyer 库,它简化了从数据框中筛选和选择值的过程。请注意,我在第一行更改了 BoneMarrow 的值,使 Bladder 的大小超过五倍。

大部分代码只是为了设置示例,使其可重现;第一行和最后一行是问题的实际答案。

library(dplyr)

txt=
"gene,Adrenal,Amygdala,Bladder,BoneMarrow
1007_s_at,100.46973369,11.26483864,10.43303178,1.907426976
1053_at,6.446570421,6.462840464,6.570665594,7.068326351
117_at,8.018137441,7.738652705,7.604989675,8.38937883
121_at,10.78168853,10.3223056,10.38043102,10.73936285
1255_g_at,5.625038847,6.132930765,5.526885199,5.448521716
1294_at,8.37142904,8.1019947,8.549260758,8.697436419
1316_at,6.237386633,6.429011484,6.083330287,6.295933456
1320_at,6.206410651,6.139873183,6.328348899,6.251521738
1405_i_at,6.588370219,5.949622255,7.420451672,8.823058974"

df = read.table(textConnection(txt), header=TRUE, sep=',')

filter(df, Bladder >= BoneMarrow * 5) %>% select(Bladder)

【讨论】:

  • 对不起,我的问题不是很清楚。当我运行您的代码“eval(expr,envir,enclos)中的错误:找不到对象'Bladder'”时出现此错误。似乎在您的代码中,假定 Bladder 中的值将是 BoneMarrow 的 5 倍以上,但我的假设是 Bladder 中的值应该是另一列的 5 倍以上。不过还是谢谢。
  • 那个错误是因为我在我的数据集中做了一些愚蠢的事情和使用制表符分隔符,当有人复制粘贴它时,这只是在乞求问题。我将其更改为 csv,因此希望它现在可以为您解析。
  • 当您说“Bladder 中的值应该是另一列的 5 倍”时,您的意思是 Bladder 应该是 any 其他列的 5 倍,还是 每隔列?
  • 我的意思是它应该是其他列的 5 倍。抱歉没有说清楚。
【解决方案2】:

您想根据自己的情况执行数据的子集。在这里,我假设您的数据位于名为 df 的数据框中:

df[df$Bladder > apply(5 * subset(df, select=-c(gene, Bladder)), 1, max),]

这将选择dfBladder 列大于其他列最大值5 倍的行。我们使用subset 命令选择除Bladdergene 之外的所有列,并使用apply 计算逐行max,并将MARGIN 设置为1(即第一个边距或行)。

使用您帖子中的更新数据,我们得到:

##       gene  Adrenal Amygdala  Bladder BoneMarrow
##1 1007_s_at 10.43303 11.26484 100.4697   9.907427

数据是:

df <- structure(list(gene = structure(1:9, .Label = c("1007_s_at", 
"1053_at", "117_at", "121_at", "1255_g_at", "1294_at", "1316_at", 
"1320_at", "1405_i_at"), class = "factor"), Adrenal = c(10.43303178, 
6.446570421, 8.018137441, 10.78168853, 5.625038847, 8.37142904, 
6.237386633, 6.206410651, 6.588370219), Amygdala = c(11.26483864, 
6.462840464, 7.738652705, 10.3223056, 6.132930765, 8.1019947, 
6.429011484, 6.139873183, 5.949622255), Bladder = c(100.46973369, 
6.570665594, 7.604989675, 10.38043102, 5.526885199, 8.549260758, 
6.083330287, 6.328348899, 7.420451672), BoneMarrow = c(9.907426976, 
7.068326351, 8.38937883, 10.73936285, 5.448521716, 8.697436419, 
6.295933456, 6.251521738, 8.823058974)), .Names = c("gene", "Adrenal", 
"Amygdala", "Bladder", "BoneMarrow"), class = "data.frame", row.names = c(NA, 
-9L))

【讨论】:

  • 感谢完美。您能否解释一下您的答案的这一部分,“我们使用应用程序计算行最大值,并将 MARGIN 设置为 1(即第一个边距或行)”
  • @pali:见?apply。基本上,apply 沿多维数组或矩阵的维度(在文档中称为边距)应用函数。这里,函数是max,我们希望将它应用到数据框的rows(第一个边距或维度)(不包括geneBladder 列)。
猜你喜欢
  • 2011-02-20
  • 1970-01-01
  • 2020-03-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多