【发布时间】:2017-10-17 14:44:00
【问题描述】:
我有一个名为 all_genes 的数据框,共有 157 列,第一列是包含基因名称的 genes 列。感兴趣的列从第 50 到第 157 列,分 2 步(50、52、54、56 等),它们是样本的名称。这些列具有三种类型的值:1、2 或3,知道对于同一行(相同的基因),我们可以为不同的样本提供三种类型的值。
例如,基因X这一行第50列的值为1,但第52列的值为2。
我希望根据这些值从偶数列中提取所有行。为了更好地理解,数据框如下所示:
现在,我编写了这段代码来提取例如值1 的行:
# extracting rows of value "1" from column 50 to 157, by taking into account only the even columns
df <- all_genes[which(all_genes[, seq(50, 157, 2)] == 1), ]
# removing NAs if all the rows are NAs from columns 50 to 157
df <- df[rowSums(is.na(df[, 50:157])) != ncol(df[, 50:157]), ]
但是,我得到的是以下内容:
如您所见,第一列包含的值都等于1,但如果您查看其他列,您会看到2(和3)的值。我认为我的代码只查看第 50 列,而忽略了在第 50 列中获得不同于 1 的值的可能性,因为对于相同的基因,我们可以在第 50 列中获得 2 的值,但在第 50 列中获得 1第 52 栏。为了确认这一点,我检查了可能性(请复制粘贴以下链接,因为我没有足够的声誉):
i.stack.imgur.com/rZQ2E.png
您能否告诉我我的代码是否正常运行,或者我应该更改一些内容吗?
如果我在代码中将1 的值更改为2,也会发生同样的事情。我仍然会在第 50 列中获得 2 的值,但在其他列中获得所有类型的值。
提前致谢。
编辑 根据@tobiasegli_te 的要求,这是一个小的可重现数据框:
structure(list(`#00e41e6a-9fe7-44f9-978b-7b05b179506a` = c(1,
1, NA, NA, NA, NA, NA, NA, NA, 1, 2, 1, NA, NA, 2, NA, 3, 1,
1, NA, NA, NA, 2, NA, 1, NA, NA, NA, NA, 1, 1, 1, NA, NA, 1,
NA, NA), `#aca312ab-6dbd-4183-8b22-8f37834f3426` = c(NA, NA,
NA, 1, NA, 1, NA, 2, 1, NA, 2, 1, 1, 1, NA, NA, NA, 1, 1, 1,
NA, 1, 2, 1, NA, 1, NA, 1, NA, NA, 1, NA, 1, NA, 1, 1, 1), `#0730216b-c201-443c-9092-81e23fd13c6c` = c(NA,
NA, NA, NA, NA, NA, 2, NA, NA, NA, NA, NA, 1, NA, NA, 1, NA,
NA, NA, NA, 1, NA, NA, NA, NA, NA, 2, NA, NA, NA, NA, NA, NA,
2, 1, NA, NA), `#acd5ceef-c5cf-4e95-9394-c50fdbc70c8d` = c(NA,
NA, 2, NA, 2, NA, 2, NA, NA, NA, NA, NA, NA, NA, NA, NA, 2, NA,
NA, NA, NA, 1, NA, NA, NA, NA, NA, NA, 1, NA, 1, NA, NA, NA,
1, NA, NA)), .Names = c("#00e41e6a-9fe7-44f9-978b-7b05b179506a",
"#aca312ab-6dbd-4183-8b22-8f37834f3426", "#0730216b-c201-443c-9092-81e23fd13c6c",
"#acd5ceef-c5cf-4e95-9394-c50fdbc70c8d"), row.names = c(1L, 2L,
4L, 6L, 8L, 10L, 11L, 16L, 20L, 22L, 23L, 30L, 32L, 37L, 38L,
43L, 45L, 46L, 47L, 49L, 50L, 53L, 62L, 64L, 65L, 67L, 68L, 69L,
70L, 71L, 73L, 74L, 76L, 77L, 79L, 80L, 81L), class = "data.frame")
【问题讨论】:
-
请使用
dput()stackoverflow.com/questions/5963269/how-to-make-a-great-提供示例数据... -
@tobiasegli_te
dput()的输出非常大,即使是droplevels和head()。但是,我已经包含了您可以直接加载的表格:drive.google.com/open?id=0B6ng04WZzK7JTEVxZF9hUFN4MkE -
显然您不必输入所有内容,只需输入足够的行和列即可了解您的问题并找出解决方案。
-
我建议将您感兴趣的列作为矩阵拉出。
focus = as.matrix(all_genes[, seq(50, 157, 2)])。在矩阵上逐行操作比在数据框上更容易。然后你可以找到全为 1 的行,忽略NAs、apply(focus == 1, MARGIN = 1, fun = all, na.rm = T)。或者识别具有所有 NA 值、apply(is.na(focus), MARGIN = 1, fun = all)等的行。 -
您可以使用
any代替all用于其他条件。这可能比您问题中的方法更有效,因为它只进行一次相对昂贵的提取和矩阵转换,而不是每次使用rowSums或apply。