【问题标题】:How to filter rows for every column如何过滤每一列的行
【发布时间】:2020-07-27 18:02:14
【问题描述】:

我有一个大数据框 (data.txt)。第一列是基因的名称,其他列是样本。这个df的一个例子:

我跟进了这篇文章:

How to filter rows for every column independently using dplyr

因为正是我正在寻找的。我想根据基因值创建 3 个子集。值的一个子集:0。

但我收到此错误:

Error: Each row of output must be identified by a unique combination of keys. Keys are shared for 448    rows: * 45317, 50187 * 64477, 65535 * 146028, 148040

我用过这段代码:

Data <- read.table("data_CNA.txt",sep="\t", header=TRUE)
library(tidyverse)
gain <- Data %>% gather(name, value, -Hugo_Symbol) %>% filter(value >= 1) %>% spread(name, value)

如果您有任何比这更好的想法,欢迎! 谢谢

【问题讨论】:

  • 是的,因为我有 5 个可能的值:-2、-1、0、1、2。所以我们可以说损失
  • 错误来自spread 函数您是否有多个同名的列或多个具有相同“Hugo_Symbol”的行?
  • @WindSur 我设法得到了 data 。我发现了一个名为“Entrez_Gene_Id”的变量,它是一个 Id 字段,您没有使用它。不确定原因。但是,要使用聚集和传播,您需要唯一标识每一行的 Id 字段。而且由于您的数据集中没有它,因此传播会向您抛出相同的错误。我已修改我的答案以将 Id 字段合并到您的数据框中。
  • 我刚刚更新了数据文件。 @Dave2e 它不应该有任何重复。

标签: r filter tidyverse


【解决方案1】:

要根据列值创建子集,您可以根据基因值创建一个 temp_field:0。然后拆分数据框使用基础库的拆分功能

df_list <- Data %>% rownames_to_column(var = "Id") %>% 
  gather(name, value, -c(Hugo_Symbol,Id)) %>%
  mutate(temp_field = case_when(value < 0 ~ "loss",
                                value > 0 ~ "gain",
                                T ~ "neutral"),
         temp_field = as.factor(temp_field)
  ) %>% split(., .$temp_field)

spread_df_func <- function(df){
  d <- df %>% select(Id,Hugo_Symbol, name, value) %>% spread(key = name, value = value)
  return(d)
}

org_df_list <- df_list %>% map(spread_df_func)

由于我没有数据可以测试,上面的函数可能有语法错误,但是逻辑上应该是正确的。

如果它解决了您的问题,请告诉我。

您也可以参考link,关于拆分和合并数据框。

【讨论】:

  • 它有效,但我不知道为什么我会获得不同长度的列。如果我有 1071 个数据变量,对于中性、收益和损失,我分别有 1072,1059,1060。中性是有意义的,因为您添加了 Id 列,但对于其他我不知道。
  • @WindSur 由于我们已经编写了值条件,因此某些字段可能不满足条件。例如:如果变量只有小于0的值,那么它只会出现在loss数据帧中,不会出现在其他两个数据帧中。
猜你喜欢
  • 1970-01-01
  • 2017-10-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-12-21
  • 2021-10-03
  • 2020-12-02
  • 2015-11-02
相关资源
最近更新 更多