【问题标题】:R - Subset a dataframe based on condition from another dataframeR - 根据来自另一个数据帧的条件子集数据帧
【发布时间】:2017-11-10 12:16:00
【问题描述】:

我有一个与this 帖子有些相似的问题,但由于情况略有变化,它对我不起作用。

我有 2 个数据框,如下所示:

> effect
  V1        V2 V3
1 G1 activates G2
2 G3     stops G4
3 G5 activates G6
4 G6     stops G7

> expression
  V1 V2
1 G1  1
2 G2  0
3 G3  1
4 G4  0
5 G5  1
6 G6  1
7 G7  1

我只想在满足以下条件的 effect 数据框中保留那些行:

  • 如果 effect$V2 == activates 那么 expression$V2 应该是 1 其中 effect$V3expression$V1 是一样的

  • 如果effect$V2 == stops 那么expression$V2 应该是0 其中 effect$V3expression$V1 是一样的

根据这个标准,我会得到这个结果:

> results
  V1        V2 V3
1 G3     stops G4
2 G5 activates G6

因为这与给定条件一致,因此对于第一行,G4V2=stopsexpression$V20

同样,对于 row2 V2=activatesexpression$V2 对于 G61

数据帧的结构如下所示。任何帮助将不胜感激。

df1:

structure(list(V1 = structure(1:4, .Label = c("G1", "G3", "G5", 
"G6"), class = "factor"), V2 = structure(c(1L, 2L, 1L, 2L), .Label = c("activates", 
"stops"), class = "factor"), V3 = structure(1:4, .Label = c("G2", 
"G4", "G6", "G7"), class = "factor")), .Names = c("V1", "V2", 
"V3"), class = "data.frame", row.names = c(NA, -4L))

df2:

structure(list(V1 = structure(1:7, .Label = c("G1", "G2", "G3", 
"G4", "G5", "G6", "G7"), class = "factor"), V2 = c(1L, 0L, 1L, 
0L, 1L, 1L, 1L)), .Names = c("V1", "V2"), class = "data.frame", row.names = c(NA, 
-7L))

【问题讨论】:

  • 我已经找到了自己问题的答案。如果管理员想要,他们可以删除这个问题。很抱歉给您带来不便。

标签: r if-statement merge subset


【解决方案1】:

我已经找到了答案。它是:

ab <- merge(effect, expression, by.x = "V3", by.y = "V1")
cd <- subset(ab, V2.x == "activates" & V2.y == 1 | V2.x == "stops" & V2.y == 0)
results <- cd[,c(2,3,1)]
> results
  V1      V2.x V3
2 G3     stops G4
3 G5 activates G6

【讨论】:

  • 您可以将所有这些合并为一个步骤,避免使用subset(merge(effect, expression, by.x = "V3", by.y = "V1"), V2.x == "activates" &amp; V2.y == 1 | V2.x == "stops" &amp; V2.y == 0)[, c(2, 3, 1)] 存储中间的data.frames
猜你喜欢
  • 2013-06-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-05
  • 1970-01-01
相关资源
最近更新 更多