Cle*_*leb 1 r subset code-conversion dataframe
在像这样创建的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)])
Run Code Online (Sandbox Code Playgroud)
这看起来如下:
c0 c1 c2 c3 c4 c5
r0 2 7 3 3 2 8
r1 6 9 6 7 9 1
r2 4 0 9 8 4 2
r3 9 0 4 3 5 4
r4 7 6 8 8 0 8
r5 0 6 1 8 2 2
Run Code Online (Sandbox Code Playgroud)
我可以使用以下方法轻松选择某些行和/或一系列列.loc:
print df.loc[['r1', 'r5'], 'c1':'c4']
Run Code Online (Sandbox Code Playgroud)
那会回来:
c1 c2 c3 c4
r1 9 6 7 9
r5 6 1 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')
Run Code Online (Sandbox Code Playgroud)
命令
df[c('r1', 'r5'),'c1':'c4']
Run Code Online (Sandbox Code Playgroud)
不起作用并抛出错误.唯一对我有用的是
df[c('r1', 'r5'), 1:4]
Run Code Online (Sandbox Code Playgroud)
返回
c1 c2 c3 c4
r1 1 2 3 4
r5 5 6 7 8
Run Code Online (Sandbox Code Playgroud)
但是,我如何按名称而不是索引选择列(当我在整个分析过程中删除某些列时,这可能很重要)?在这种特殊情况下,我当然可以使用grep但是具有任意名称的列怎么样?
所以我不想用
df[c('r1', 'r5'),c('c1','c2', 'c3', 'c4')]
Run Code Online (Sandbox Code Playgroud)
但实际的切片.
编辑:
可以在此处找到后续问题.
看起来你可以通过以下方式完成此任务subset:
> 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')
> subset(df, select=c1:c4)
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
> subset(df, select=c1:c2)
c1 c2
r1 1 2
r2 2 3
r3 3 4
r4 4 5
r5 5 6
r6 6 7
Run Code Online (Sandbox Code Playgroud)
如果你想按行名称范围进行子集化,那么这个hack会做:
> gRI <- function(df, rName) {which(match(rNames, rName) == 1)}
> df[gRI(df,"r2"):gRI(df,"r4"),]
c1 c2 c3 c4 c5 c6
r2 2 3 4 5 6 7
r3 3 4 5 6 7 8
r4 4 5 6 7 8 9
Run Code Online (Sandbox Code Playgroud)