R 为输入表的每一行只保留唯一/不同的列

R 为输入表的每一行只保留唯一/不同的列,r,dplyr,tidyr,R,Dplyr,Tidyr,我有一个非常大的数据框(nrow=~273000),我在下面举了一个例子:每一行都是一个蛋白质名称,有不同数量的列,列出了人类细胞中可以找到的亚细胞结构。1) 我想删除每行的重复条目,我正在努力解决这个问题(下面的代码)。2) 然后我想能够计算出每个基因可以在多少列(亚细胞结构)中找到 背景:我从Uniprot获得了这些数据,并使用regex尽可能地对其进行了清理,但仍有一些情况下存在重复条目的行(例如,FMR1列出了染色体2x、细胞质3x和质膜2x-此外,它们之间还有一些空白列) 我尝试过在没

我有一个非常大的数据框(nrow=~273000),我在下面举了一个例子:每一行都是一个蛋白质名称,有不同数量的列,列出了人类细胞中可以找到的亚细胞结构。1) 我想删除每行的重复条目,我正在努力解决这个问题(下面的代码)。2) 然后我想能够计算出每个基因可以在多少列(亚细胞结构)中找到

背景:我从Uniprot获得了这些数据,并使用regex尽可能地对其进行了清理,但仍有一些情况下存在重复条目的行(例如,FMR1列出了染色体2x、细胞质3x和质膜2x-此外,它们之间还有一些空白列)

我尝试过在没有运气的情况下为每行获取唯一的列,例如:

unique(df1) # Original data with repeats removed
dplyr::distinct(df1) # Retain only unique/distinct rows from an input tb
我认为问题在于上面的函数正在寻找相同的行名称,这不是我想要的。我希望每行有不同的列。我曾考虑使用
melt
函数,但由于每行的列数都是奇数,所以这不起作用

我希望输出像这样
newDF

structure(list(FMR1 = structure(c(7L, 1L, 3L, 9L, 2L, 4L, 6L, 
5L, 8L), .Label = c("AIMP1 EMAP2 SCYE1", "CDK1 CDC2 CDC28A CDKN1 P34CDC2", 
"CEMIP KIAA1199", "ECT2", "HDAC6 KIAA0901 JM21", "ITGB1BP1 ICAP1", 
"NGDN C14orf120", "PTPN23 KIAA1471", "RACGAP1 KIAA1478 MGCRACGAP"
), class = "factor"), Nucleus = structure(c(2L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L), .Label = c("Nucleus", "Nucleus  "), class = "factor"), 
    Chromosome = structure(c(1L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 
    2L), .Label = c("Chromosome", "Cytoplasm"), class = "factor"), 
    Cytoplasmic.vesicle = structure(c(1L, 8L, 2L, 4L, 5L, 4L, 
    7L, 6L, 3L), .Label = c("Cytoplasm  ", "Endoplasmic reticulum", 
    "Endosome", "Midbody", "Mitochondrion", "Perikaryon  ", "Plasma membrane  ", 
    "Secreted  "), class = "factor"), Perikaryon = structure(c(1L, 
    2L, 3L, 3L, 1L, 3L, 1L, 1L, 1L), .Label = c("", "Endoplasmic reticulum  ", 
    "Plasma membrane"), class = "factor"), Plasma.membrane = c(NA, 
    NA, NA, NA, NA, NA, NA, NA, NA)), .Names = c("FMR1", "Nucleus", 
"Chromosome", "Cytoplasmic.vesicle", "Perikaryon", "Plasma.membrane"
), class = "data.frame", row.names = c(NA, -9L))
从这里我想得到一个
rowSums(df1)
,所以我想强制每个术语为一个数字(例如,细胞质小泡=1,细胞核=1,内质网=1,等等),但在这个虚拟数据集上遇到了一个问题

df2 <- as.numeric(newDF)
Error: (list) object cannot be coerced to type 'double'
df2 <- as.numeric(newDF[,2:n])
Error in 2:n : NA/NaN argument

这可能是一条路要走。由于您的预期结果是字符向量,因此我无法可视化最终输出。然而,你说你想检查每个蛋白质在数据中出现了多少列。我希望我的结果是你想要的

首先,我将所有列转换为字符。然后,我使用
gather()
将数据转换为长格式数据。对于每个亚细胞结构组(即亚细胞),我添加了行索引(例如,1表示原始数据中的第一行),并修剪空白。然后,删除蛋白质中含有
NA
的所有行。删除带有
的所有行。现在收拾好了。对于每一行(即,
row.index
),删除重复的蛋白质类型。 将数据解组,最后计算每个蛋白质出现的列数(即细胞结构)。基本上,您要计算到目前为止每个蛋白质在数据集中出现的次数

根据你的样本数据,我得到了以下结果。但我不确定这是否是你想要的。(我现在要睡觉了。所以我有几个小时帮不了你。如果有人能跳进去,请跳进去。)


@Hardikgupta的可能重复链接中的建议答案不适用于我的数据。例如:
privefl=as.data.frame(t(apply(t(temp),2,myf)))
对于蛋白质FMR1,它只是部分地改变了值,在核周体和质膜之间仍然有一个空列,没有NA值。它也没有删除任何重复值。@MatthewJ.Oldach我想知道您的预期结果。阅读你的问题,你想知道每个基因出现了多少列。因此,您希望看到一个包含基因名称和总数的数据框。是这样吗?我编辑这篇文章是为了我的预期结果。我不是在寻找每个基因出现了多少列。我感兴趣的是每行有多少个独特的列(即gene)。回答得不错。如果我正确解释了
rowSums(df1)
调用,他想知道每个蛋白质有多少个隔间,而不是隔间的频率。但我可能错了。谢谢@jjl这是正确的,这就是我要找的。非常感谢@jazzurro编辑的“每行有多少个名称”。我以前只在tidyr和dplyr上做过一点工作,但您确实启发了我对dplyr软件包的了解。我刚刚购买了datacamp.com的会员资格,将参加课程:)@MatthewJ.Oldach我很高兴听到这个消息。所以我想我的第二个建议就是你想要的。对吗?如果您的案例已经完成,您是否会在“向上/向下投票”三角形旁边打一个绿色勾号来结束该案例?然后,让用户知道您的案例已结案。学习dplyr是一件有趣的事情。享受!:)我应该指出的一点是,@jazzurro solution计算每一列,包括蛋白质(第一列),所以我只需要从每一列中减去一;没什么大问题。我的工作是
df$n
df2 <- as.numeric(newDF)
Error: (list) object cannot be coerced to type 'double'
df2 <- as.numeric(newDF[,2:n])
Error in 2:n : NA/NaN argument
FMR1 5
NGDN C14orf120 3
AIMP1 EMAP2 SCYE1 4
CEMIP KIAA1199 4
RACGAP1 KIAA1478 MGCRACGAP 4
CDK1 CDC2 CDC28A CDKN1 P34CDC2 3
ECT2 4
ITGB1BP1 ICAP1 3
HDAC6 KIAA0901 JM21 3
PTPN23 KIAA1471 3
mutate_all(mydf, as.character) %>%
gather(key = subcellular, value = protein) %>%
group_by(subcellular) %>%
mutate(row.index = 1:n(), 
       protein = trimws(protein)) %>%
filter(!is.na(protein)) %>%
filter(!protein %in% c("", " ")) %>%
group_by(row.index) %>%
filter(!duplicated(protein)) %>%
ungroup %>%
count(protein, sort = TRUE)


#                  protein     n
#                   <chr> <int>
# 1             Cytoplasm    82
# 2       Plasma membrane    70
# 3               Nucleus    25
# 4              Endosome     9
# 5         Mitochondrion     9
# 6   Cytoplasmic vesicle     8
# 7       Golgi apparatus     7
# 8 Endoplasmic reticulum     5
# 9               Midbody     3
#10            Perikaryon     3
# ... with 87 more rows
mutate_all(mydf, as.character) %>%
gather(key = subcellular, value = protein) %>%
group_by(subcellular) %>%
mutate(row.index = 1:n(), 
       protein = trimws(protein)) %>%
filter(!is.na(protein)) %>%
filter(!protein %in% c("", " ")) %>%
group_by(row.index) %>%
filter(!duplicated(protein)) %>%
ungroup %>%
count(row.index)

#   row.index     n
#       <int> <int>
# 1         1     4
# 2         2     6
# 3         3     5
# 4         4     6
# 5         5     4
# 6         6     5
# 7         7     4
# 8         8     4
# 9         9     5
#10        10     3
# ... with 72 more rows
mutate_all(mydf, as.character) %>%
gather(key = subcellular, value = protein) %>%
group_by(subcellular) %>%
mutate(row.index = 1:n(), 
       protein = trimws(protein)) %>%
filter(!is.na(protein)) %>%
filter(!protein %in% c("", " ")) %>%
group_by(row.index) %>%
filter(!duplicated(protein)) %>%
ungroup %>%
filter(subcellular != "FMR1") %>%
count(row.index)

# A tibble: 9 x 2
#  row.index     n
#      <int> <int>
#1         1     3
#2         2     4
#3         3     4
#4         4     4
#5         5     3
#6         6     4
#7         7     3
#8         8     3
#9         9     3