在创建如下的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 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
我可以使用.loc
轻松选择特定的行和/或一系列列:
print df.loc[['r1', 'r5'], 'c1':'c4']
这将返回:
c1 c2 c3 c4
r1 9 6 7 9
r5 6 1 8 2
那么,在列表中,我可以选择特定的行/列,使用冒号选择一系列行/列。
那么如何在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')
命令
df[c('r1', 'r5'),'c1':'c4']
这段代码无法正常运行并且会抛出一个错误。唯一对我有效的方法是
df[c('r1', 'r5'), 1:4]
这个函数返回
c1 c2 c3 c4
r1 1 2 3 4
r5 5 6 7 8
但是我该如何根据列名而不是索引选择列(当我在分析过程中删除某些列时,这可能很重要)?在这种特殊情况下,我当然可以使用 grep
,但对于具有任意名称的列呢?
因此,我不想使用
df[c('r1', 'r5'),c('c1','c2', 'c3', 'c4')]
但实际上是一段。
编辑:
后续问题可以在这里找到。
df.loc ['r1':'r3','c1':'c4']
,因此行和列并没有被区分对待。如果没有更好的答案出现,我当然会接受提供的答案(请参阅我的第一个评论)。是的,你是对的,我应该在原始问题中放置行选择,所以我理解你的负投票;谢谢解释! - Clebbase::subset
(如答案中所示)、dplyr::select
或data.table
。我不知道除了黑客攻击之外是否有任何行名称的方法。但这会成为一个很好的单独问题,并可能获得一些特定的兴趣/创新解决方案。 - Gregor Thomas