【问题标题】:Is there a way in R to filter a data frame by two sequential conditions?R中有没有办法通过两个顺序条件过滤数据框?
【发布时间】:2021-08-20 01:55:18
【问题描述】:

我有一个代表 Pearson 相关性结果的数据框。这是一个结构示例:

Row     | Column | cor
Event   |Event   | 1
mean    |Event   | .82
mean    |kurtosis| .30
mean    |entropy | .85
entropy |Event   | .71
entropy |kurtois | .25
kurtosis|Event   | .69

我需要过滤相关性,因此如果两个特征之间的相关性大于 0.80(条件 1)阈值,则仅选择与“事件”关联度最高的变量(条件 2)。 我希望最终产品看起来像这样:

Row     | Column | cor
mean    |Event   | .82

在上面的示例中,均值和熵在阈值之上是相关的,但是,“均值”与“事件”具有更高的相关性,因此这是最终的输出。我正在使用生物数据,所以我有 100 多个特征,手动操作太多了。

【问题讨论】:

  • 如果cor(kurtosis, Event) 是 0.87 你会得到什么行?

标签: r filter conditional-statements sequential


【解决方案1】:

我们可以的

library(dplyr)
df1 %>%
     filter(Row  != Column, cor > 0.80, Column == 'Event')

-输出

#   Row Column  cor
#1 mean  Event 0.82

或使用data.table

library(data.table)
setDT(df1)[Row!= column & cor > 0.8 & Column == 'Event']

数据

df1 <- structure(list(Row = c("Event", "mean", "mean", "mean", "entropy", 
"entropy", "kurtosis"), Column = c("Event", "Event", "kurtosis", 
"entropy", "Event", "kurtois", "Event"), cor = c(1, 0.82, 0.3, 
0.85, 0.71, 0.25, 0.69)), class = "data.frame", row.names = c(NA, 
-7L))

【讨论】:

  • 这可行,但处理时间大约是 R 基本答案的 10 倍。
  • @Baroque 是更大数据集上的时序
  • 这完成了第一步,找到了大约 0.80 的相关性,但现在我需要找出第 1 步的哪些结果与“事件”的相关性最高,即第 2 步
  • 请查看 OP 预期输出。这提供了更多行
【解决方案2】:

像这样?所述条件并未涵盖所有基础,但这给出了该问题所需的结果

df[df$cor>.8 & df$Column=="Event" & df$Row!="Event",]

【讨论】:

  • subset(df, Row!=Column &amp; Column == 'Event' &amp; cor&gt;0.8)
  • 这也行得通,根据microbenchmark,在处理速度方面处于同一数量级,尽管速度稍慢
  • 我尝试了这两种方法,我得到一个空数据框
  • 如果没有一行所有条件同时为真,就会发生这种情况,因为我们使用的是 AND (&)
猜你喜欢
  • 1970-01-01
  • 2020-04-08
  • 1970-01-01
  • 1970-01-01
  • 2021-07-29
  • 2020-12-13
  • 2015-02-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多