R从data.frame中选择某些行间隔

时间:2013-01-01 20:02:22

标签: r select row dataframe intervals

我试图在谷歌上找到一个解决方案但是5小时后我希望我能从社区找到答案,所以非常感谢你。

我有一个data.frame:

    > out.allpheno["MAP2K2"]
            MAP2K2
c1m2      5.55e-02
c1.loc42  4.32e-02
c1.loc52  6.04e-02
c1m10     3.19e-01
c1.loc103 6.12e-01
c1.loc107 8.65e-01
c1m12     1.03e+00
c1.loc113 1.04e+00
c1.loc117 1.07e+00
c1.loc128 7.91e-01
c1m14     4.92e-01
c1.loc134 5.65e-01
c1.loc135 6.10e-01
c1.loc157 3.63e-01
c1m16     1.81e-01
c1.loc177 5.61e-02
c1m18     9.03e-02
c1.loc182 1.08e-01
c1m19     2.38e-01
c1m22     9.20e-02
c1.loc219 1.03e-01
c1m24     1.62e-01
c1.loc236 3.83e-01
c1.loc240 7.45e-01
c1.loc262 2.00e+00
c1.loc267 2.41e+00
c1.loc268 2.48e+00
c1.loc269 2.53e+00
c1.loc270 2.56e+00
c1m28     2.57e+00
c1.loc272 2.52e+00
c1.loc273 2.46e+00
c1.loc274 2.37e+00
c1.loc276 2.12e+00
c1m30     9.63e-01
c1m31     1.89e+00
c2m1      5.85e-01
c2.loc11  5.27e-01
c2m5      5.51e-01
c2m6      5.15e-01
c2.loc52  6.56e-01
c2m7      1.05e+00
c2.loc59  1.07e+00
c2.loc62  1.05e+00
c2.loc72  4.90e-01
c2.loc91  3.63e-01
c2m11     3.63e-01
c2.loc103 3.08e-01
c2.loc114 8.62e-02
c2m14     2.99e-02
c2.loc129 3.15e-02
c2.loc151 2.95e-02
c2.loc167 2.21e-01
c2.loc199 1.49e+00
c2.loc200 1.53e+00
c2.loc201 1.56e+00
c2.loc203 1.61e+00
c2.loc204 1.63e+00
c2m21     1.63e+00
c2.loc214 1.32e+00
c2.loc218 1.16e+00
c2.loc229 3.23e-01
c2.loc237 7.70e-03
c2.loc241 2.57e-02
c2m25     3.81e-02
c3.loc1   8.17e-01
c3.loc4   6.51e-01
c3.loc32  2.95e-01
c3.loc35  3.14e-01
c3m6      8.02e-01
c3.loc54  9.58e-01
c3.loc71  1.48e+00
c3.loc73  1.47e+00
c3m9      1.00e+00
c3.loc89  2.55e-01
c3m10     1.47e-01
c3.loc94  2.84e-01
c3m14     2.37e-01
c3m15     9.24e-04
c3.loc152 2.47e-02
c3m16     4.88e-02
c3.loc175 3.69e-05
c3.loc180 6.16e-02
c3m20     4.87e-01
c3.loc199 4.08e-01
c3m25     8.00e-02
c3.loc248 1.60e-01
c3m26     2.66e-01
c3.loc268 1.53e+00
c3.loc271 1.85e+00
c3.loc273 1.95e+00
c3m28     1.97e+00
c3m29     1.01e+00
c4m4      8.34e-03
c4.loc39  3.94e-03
c4m5      2.81e-03
c4.loc48  1.92e-02
c4.loc57  2.08e-02
c4m7      8.11e-03
c4.loc67  5.92e-03
c4m9      6.74e-02
c4m10     5.28e-01
c4m12     8.52e-01
c4.loc121 2.97e-01
c4m17     5.38e-02
c4m20     1.88e-02
c4m22     3.58e-01
c4m24     1.66e-02
c4.loc236 1.68e-02
c4.loc288 1.62e-01
c4.loc295 1.72e-01
c4m31     1.72e-01
c4.loc313 4.18e-03

我想检索从c1m2到c2m25的行。是否有任何内置函数来实现这一点,或者我是否需要创建一个循环并检查每行中是否包含我要包含的元素?谢谢

3 个答案:

答案 0 :(得分:4)

有序因子可让您使用>=<=与字符值进行比较,定义自定义顺序(即字母顺序除外)。

这是一个比您要求的更短的子集,但您可以使用任何值作为边界:

f <- factor(rownames(out.allpheno), levels=rownames(out.allpheno), ordered=TRUE)
out.allpheno[f >= 'c1m14' & f <= 'c1m16', ,drop=FALSE]

##           MAP2K2
## c1m14      0.492
## c1.loc134  0.565
## c1.loc135  0.610
## c1.loc157  0.363
## c1m16      0.181

答案 1 :(得分:3)

如果您已将它们全部按顺序排列,则假设您的data.framedf

idx1 <- which(row.names(df) == "c1m2")
idx2 <- which(row.names(df) == "c1m25")
df[idx1:idx2, ]

答案 2 :(得分:0)

另一种可能的解决方案,使用正则表达式:

my_regex <- "^c[12]"
matched_rownames <- grep( my_regex, rownames(df), value=TRUE )
df[ rownames(df) %in% matched_rownames, , drop=FALSE ]

如果您确定行名称遵循常规结构但它们可能出现故障,并且您知道您只想抓取以c1开头的任何行,则这将非常方便c2