【发布时间】:2016-10-09 09:49:43
【问题描述】:
在这样创建的 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 中做到这一点? Here 和 here 总是必须通过索引指定所需的列范围,但不能 - 或者至少我没有找到 - 按名称访问它们。举个例子:
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')]
但实际切片。
编辑:
可以在here找到后续问题。
【问题讨论】:
-
@downvoter:你能解释一下你为什么投反对票吗?这是一个带有最小可重现示例的明确问题,那么问题是什么?
-
感觉有点像移动球门柱以专门询问有关列的问题,然后在提交答案后对其进行编辑以包含行。回滚编辑并提出一个新问题可能会更好。它们看起来非常相关,但列名和行名在 R 数据帧中的处理方式截然不同。 (虽然不是我的反对意见 - 并且不确定这是否是原因。)
-
@Gregor:好的,我对 R 的细节不太熟悉,在 Pandas 中它是直截了当的,我可以这样做:
df.loc['r1':'r3', 'c1':'c4']所以行和列不会被区别对待。如果没有更好的结果,我当然会接受提供的答案(请参阅下面的第一条评论),因为它确实回答了原始问题。是的,你是对的,我应该将行选择放在原始问题中,所以我理解你的反对意见;谢谢你的解释! -
即使从一开始,我认为它作为一个单独的问题会更好(但我仍然没有反对)。我可以想到三种好的列方法:
base::subset如答案或dplyr::select或data.table。除了 hacking 之外,我不知道行名的任何方法。但这将是一个很好的单独问题,并且可能会获得一些特定的兴趣/创新解决方案。 -
@Gregor:好的,谢谢。如前所述,我不知道行和列选择的处理方式不同,我再次编辑我的问题;感谢您让我意识到这一点。
标签: r dataframe subset code-conversion