【问题标题】:Extracting all rows from multiple columns with specific value from dataframe in R从R中的数据框中提取具有特定值的多列中的所有行
【发布时间】:2017-10-17 14:44:00
【问题描述】:

我有一个名为 all_genes 的数据框,共有 157 列,第一列是包含基因名称的 genes 列。感兴趣的列从第 50 到第 157 列,分 2 步(50525456 等),它们是样本的名称。这些列具有三种类型的值:123,知道对于同一行(相同的基因),我们可以为不同的样本提供三种类型的值。

例如,基因X这一行第50列的值为1,但第52列的值为2

我希望根据这些值从偶数列中提取所有行。为了更好地理解,数据框如下所示:

Original dataframe

现在,我编写了这段代码来提取例如值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]), ]

但是,我得到的是以下内容:

Output of the above code

如您所见,第一列包含的值都等于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() 的输出非常大,即使是 droplevelshead()。但是,我已经包含了您可以直接加载的表格: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 用于其他条件。这可能比您问题中的方法更有效,因为它只进行一次相对昂贵的提取和矩阵转换,而不是每次使用 rowSumsapply

标签: r dataframe


【解决方案1】:

对于第一种情况尝试类似

mtcars[sapply(1:nrow(mtcars), function(i) any(mtcars[i, seq(2, ncol(mtcars), 2)] == 4)),]

                # mpg cyl  disp  hp drat    wt  qsec vs am gear carb
# Mazda RX4      21.0   6 160.0 110 3.90 2.620 16.46  0  1    4    4
# Mazda RX4 Wag  21.0   6 160.0 110 3.90 2.875 17.02  0  1    4    4
# Datsun 710     22.8   4 108.0  93 3.85 2.320 18.61  1  1    4    1
# Merc 240D      24.4   4 146.7  62 3.69 3.190 20.00  1  0    4    2
# Merc 230       22.8   4 140.8  95 3.92 3.150 22.90  1  0    4    2
# Merc 280       19.2   6 167.6 123 3.92 3.440 18.30  1  0    4    4
# Merc 280C      17.8   6 167.6 123 3.92 3.440 18.90  1  0    4    4
# Fiat 128       32.4   4  78.7  66 4.08 2.200 19.47  1  1    4    1
# Honda Civic    30.4   4  75.7  52 4.93 1.615 18.52  1  1    4    2
# Toyota Corolla 33.9   4  71.1  65 4.22 1.835 19.90  1  1    4    1
# Toyota Corona  21.5   4 120.1  97 3.70 2.465 20.01  1  0    3    1
# Fiat X1-9      27.3   4  79.0  66 4.08 1.935 18.90  1  1    4    1
# Porsche 914-2  26.0   4 120.3  91 4.43 2.140 16.70  0  1    5    2
# Lotus Europa   30.4   4  95.1 113 3.77 1.513 16.90  1  1    5    2
# Volvo 142E     21.4   4 121.0 109 4.11 2.780 18.60  1  1    4    2

为了您的数据

all_genes[sapply(1:nrow(all_genes), function(i) any(all_genes[i, seq(50, 157, 2)] == 1)),]

对于第二种情况尝试类似

mtcars[sapply(1:nrow(mtcars), function(i) all(is.na(mtcars[i, seq(2, ncol(mtcars), 2)]))),]

为了您的数据

all_genes[sapply(1:nrow(all_genes), function(i) all(is.na(all_genes[i, seq(50, 157, 1)]))),]

【讨论】:

  • 非常感谢您的回答!这正是我一直在寻找的。应用于我的数据的第一个案例的代码效果更好。我想我现在明白出了什么问题。 +1
猜你喜欢
  • 2013-06-29
  • 1970-01-01
  • 1970-01-01
  • 2021-06-03
  • 1970-01-01
  • 2021-11-28
  • 1970-01-01
  • 2018-03-28
  • 1970-01-01
相关资源
最近更新 更多