我有一个非常大的数据框,看起来像这样:
Gene Sample1 Sample2
A 1 0
A 0 1
A 1 1
B 1 1
C 0 1
C 0 0
我想只保留Gene列中存在重复的行。
所以表格会变成:
Gene Sample1 Sample2
A 1 0
A 0 1
A 1 1
C 0 1
C 0 0
我已尝试在R中使用subset(df, duplicated(df$Genes))
但我认为它留下了一些非重复,因为命名比A / B / C更复杂。喜欢:WASH11,KANSL-1等
这可以在R或Linux shell中完成吗?
答案 0 :(得分:3)
在R中,您可以从duplicated()
双倍向上,从两个方向开始。
df[with(df, duplicated(Gene) | duplicated(Gene, fromLast = TRUE)), ]
# Gene Sample1 Sample2
# 1 A 1 0
# 2 A 0 1
# 3 A 1 1
# 5 C 0 1
# 6 C 0 0
您还可以使用第一列的表格。
tbl <- table(df$Gene)
df[df$Gene %in% names(tbl)[tbl > 1], ]
# Gene Sample1 Sample2
# 1 A 1 0
# 2 A 0 1
# 3 A 1 1
# 5 C 0 1
# 6 C 0 0
其他选项,根据实际数据可能有效或可能无效......
df[(table(df$Gene) > 1)[df$Gene],] ## credit to Pierre LaFortune
## or
df[with(df, (tabulate(Gene) > 1)[Gene]), ]
答案 1 :(得分:3)
您可以通过应用ave
并计算条目来找到每个的数量:
ave(as.numeric(x$Gene), x$Gene, FUN=length)
## [1] 3 3 3 1 2 2
在此表达式中,ave
的第一个参数只需要一个数字,其长度等于数据框中的行数。
使用它来选择行:
count <- ave(as.numeric(x$Gene), x$Gene, FUN=length)
x[count>1,]
## Gene Sample1 Sample2
## 1 A 1 0
## 2 A 0 1
## 3 A 1 1
## 5 C 0 1
## 6 C 0 0
答案 2 :(得分:2)
使用Perl从命令行
<asp:Checkbox ID="switchAdmin" CssClass="cmn-toggle cmn-toggle-round" ClientIDMode="Static" Runat="server" />
<label for="switchAdmin"></label>
cat counts.txt
Gene Sample1 Sample2
A 1 0
A 0 1
A 1 1
B 1 1
C 0 1
C 0 0
perl -ne '$cg{ (split /\t/,$_)[0] }++; push (@lines, $_); END { print shift @lines; foreach (@lines) { print if ($cg{ (split /\t/,$_)[0] } >= 2) }}' counts.txt
Gene Sample1 Sample2
A 1 0
A 0 1
A 1 1
C 0 1
C 0 0
哈希计算每个基因的出现次数。通过仅选择每行上%cg
操作的第一个元素[0]
来提取基因。 split
逐行保存文件的全部内容。然后@lines
块仅输出其基因出现≥2次的那些行。