【问题标题】:r - subset multiple data frames (or one list) based on cut-offs from a reference data framer - 基于参考数据帧的截断子集多个数据帧(或一个列表)
【发布时间】:2015-06-23 15:54:01
【问题描述】:

我有一系列代表不同分子 (F0001, F0002,...,) 的数据框,其中包含使用该分子的实验的成百上千的分数。每个数据框都是这样的。

F0001

    PoseID  Score
1   AAAA_1  -13.70
2   AAAA_2  -9.21
3   AAAA_3  -7.60
4   AAAA_4  -6.28
5   ....

F0002

    PoseID  Score
1   AAAB_1  -14.90
2   AAAB_2  -13.92
3   AAAB_3  -13.49
4   AAAB_4  -11.95
5   ....

等等等等

基于截止值,我想对数据进行子集以剔除任何高于所述截止值的姿势,因此,进行简单的二进制比较。一个稍微复杂的因素是每个 (F0001, F0002,...,) 的截止值都不同,所以我继续将它们存储在数据框中(我们称之为 cutoffs

分界线

     FragmentID     ScoreCutOff
1    F0001          -9.69
2    F0002          -9.33
3    F0003          -8.50
4    ....

所以我想问题变成了,我是在cutoffs 和每个数据帧之间进行比较,还是将所有数据帧添加到一个列表中,然后在cutoffs 和那里的数据帧列表之间进行比较?

我觉得Ari Friedman's answer 很准,所以我正在使用 sapply/any 工具来让它工作,通常使用 Python/CPP/ 中的嵌套循环和数据结构很容易解决这类问题Java,但我是 R 中的新手,所以我很想听听人们的任何其他想法。当然,如果我在此期间自己解决它,我会发布解决方案以供批评。

【问题讨论】:

  • 我首先从 cutoffs$FragmentID 列构建一个命名数据帧列表,然后使用该列表上的mapply 作为第一个参数,第二个参数作为相应的 $ScoreCutoff 值。设置它的工作量似乎太大了。您应该学会发布用 R 编写的示例。
  • 是的,干杯,我是该网站的新手,所以没想到这样做。
  • 上面的评论是@人提醒我勾选正确的解决方案但其评论不再存在。 :)

标签: r


【解决方案1】:

根据您提供的信息,这样的事情应该可以完成:

# bring your data.frames into a list:
f <- list( F0001, F0002 )
> f
[[1]]
  PoseID  Score
1 AAAA_1 -13.70
2 AAAA_2  -9.21
3 AAAA_3  -7.60
4 AAAA_4  -6.28

[[2]]
  PoseID  Score
1 AAAB_1 -14.90
2 AAAB_2 -13.92
3 AAAB_3 -13.49
4 AAAB_4 -11.95

# subset per list item
for( i in 1 : length( f ) ) 
    f[[ i ]] <- f[[ i ]][ f[[ i ]][ 2 ] < cutoffs[ i, 2 ], ]
> f
[[1]]
  PoseID Score
1 AAAA_1 -13.7

[[2]]
  PoseID  Score
1 AAAB_1 -14.90
2 AAAB_2 -13.92
3 AAAB_3 -13.49
4 AAAB_4 -11.95

不确定“高于截止”是什么意思,也许你必须扭转小于&lt; 的操作。我还假设在cutoffs 中,数据的顺序与 data.frames 列表中的顺序完全相同,否则可能需要进行一些额外的操作来识别相应的截止值。

【讨论】:

  • 是的,对不起,应该更清楚。基本上,这些是能量分数,所以更低=更好,但我使用的是“高于”的量级。
  • 您的解决方案也不错,仅供参考,但在这种情况下,我对 apply 方法投了票,主要是为了保持一致性,因为这就是我最近一直在做的事情。我是新手,所以还不能投票......
【解决方案2】:

假设 df1, df2 作为数据帧,您可以使用 lapply 尝试此操作

dflist = list(df1, df2)
names(dflist) = cutoffs$FragmentID

out = lapply(names(dflist), 
      function(x){ 
        cfval = subset(cutoff, FragmentID %in% x); 
        subset(dflist[[x]], Score < cfval$ScoreCutOff)
      })

names(out) = cutoff$FragmentID

#> out
#$F0001
#  PoseID Score
#1 AAAA_1 -13.7
# 
#$F0002
#  PoseID  Score
#1 AAAB_1 -14.90
#2 AAAB_2 -13.92
#3 AAAB_3 -13.49
#4 AAAB_4 -11.95

稍后如果您想单独拥有所有数据帧,您可以这样做

# data-frames with names F0001, F0002, ....
list2env(out,.GlobalEnv)

【讨论】:

  • 非常完美。其他解决方案没有问题,但这些天我正在研究 s/l/m/apply。再次干杯!
猜你喜欢
  • 2018-06-07
  • 2019-01-25
  • 2018-07-08
  • 1970-01-01
  • 1970-01-01
  • 2019-10-22
  • 2020-07-07
  • 1970-01-01
  • 2021-10-16
相关资源
最近更新 更多