如何通过根据名称而不是索引选择一系列列和行来切片数据框?

Cle*_*leb 6 r subset slice dataframe

这是我在这里提出的问题的后续问题.在那里我学习了a)如何为列做这个(见下文)和b)在R中行和列的选择看起来差别很大,这意味着我不能对行使用相同的方法.

所以假设我有一个像这样的pandas数据帧:

import pandas as pd
import numpy as np

df = pd.DataFrame(np.random.randint(10, size=(6, 6)),
                  columns=['c' + str(i) for i in range(6)],
                  index=["r" + str(i) for i in range(6)])

    c0  c1  c2  c3  c4  c5
r0   4   2   3   9   9   0
r1   9   0   8   1   7   5
r2   2   6   7   5   4   7
r3   6   9   9   1   3   4
r4   1   1   1   3   0   3
r5   0   8   5   8   2   9
Run Code Online (Sandbox Code Playgroud)

然后我可以通过它们的名称轻松选择行和列,如下所示:

print df.loc['r3':'r5', 'c1':'c4']
Run Code Online (Sandbox Code Playgroud)

返回

    c1  c2  c3  c4
r3   9   9   1   3
r4   1   1   3   0
r5   8   5   8   2
Run Code Online (Sandbox Code Playgroud)

我怎么会在R?给出这样的数据帧

df <- data.frame(c1=1:6, c2=2:7, c3=3:8, c4=4:9, c5=5:10, c6=6:11)
rownames(df) <- c('r1', 'r2', 'r3', 'r4', 'r5', 'r6')

   c1 c2 c3 c4 c5 c6
r1  1  2  3  4  5  6
r2  2  3  4  5  6  7
r3  3  4  5  6  7  8
r4  4  5  6  7  8  9
r5  5  6  7  8  9 10
r6  6  7  8  9 10 11
Run Code Online (Sandbox Code Playgroud)

显然,如果我知道所需行/列的索引,我可以简单地做:

df[3:5, 1:4]
Run Code Online (Sandbox Code Playgroud)

但我可能会在整个分析过程中删除行/列,以便我更愿意按名称而不是按索引进行选择.从上面的链接我了解到,对于列,以下方法可行:

subset(df, select=c1:c4)
Run Code Online (Sandbox Code Playgroud)

返回

  c1 c2 c3 c4
r1  1  2  3  4
r2  2  3  4  5
r3  3  4  5  6
r4  4  5  6  7
r5  5  6  7  8
r6  6  7  8  9
Run Code Online (Sandbox Code Playgroud)

但是我怎样才能同时按名称选择一系列行?

在这种特殊情况下,我当然可以使用grep但是具有任意名称的列怎么样?

我不想用

df[c('r3', 'r4' 'r5'), c('c1','c2', 'c3', 'c4')]
Run Code Online (Sandbox Code Playgroud)

但实际的切片.

Hub*_*rtL 7

你可以用which()rownames:

subset(df[which(rownames(df)=='r3'):which(rownames(df)=='r5'),], select=c1:c4)


   c1 c2 c3 c4
r3  3  4  5  6
r4  4  5  6  7
r5  5  6  7  8
Run Code Online (Sandbox Code Playgroud)