2

这是一个例子。normal 是一个数据框,其行名等于未指定年份的月份和日期(如 1 月 1 日的“-01-01”)。列出的统计数据是在一定范围内的年份。

head(normal)

Source: local data frame [6 x 7]

      md    meanA      sdA  meanMax    sdMax  meanMin    sdMin
1 -01-01 40.20556 1.424404 43.20185 1.792473 37.20926 1.575386
2 -01-02 40.33056 1.473267 43.16852 2.527014 37.49259 1.480592
3 -01-03 40.29630 1.645513 43.15926 2.347826 37.43333 1.572662
4 -01-04 40.17222 1.635409 42.85000 2.502623 37.49444 1.512707
5 -01-05 40.33796 1.681560 43.22593 2.486444 37.45000 1.511158
6 -01-06 40.22685 1.767241 42.98704 2.380686 37.46667 1.591779

md
#[1] "-01-01"

normal[1,"meanA"]  
#Source: local data frame [1 x 1]

#      meanA
# 1 40.20556

normal[md,"meanA"]    
#Source: local data frame [1 x 1]

#   meanA
# 1    NA

为什么 R 不会在这里取行名的值,因为它们都是唯一的?

4

1 回答 1

3

概括

简而言之,md显示的对象列中的值不是对象的行名tbl_df,并且使用字符向量对行进行索引对行名起作用,而不是 atbl_df或 a的任意组件data.frame

另外,您似乎认为这normal是一个数据框;它不是,它是一个类的对象tbl_df,它只从类继承data.frame。这通常不会产生任何差异,但是tbl_df正如我在下面提到的,对象没有行名,并且原始数据框中的任何行名都将转换为tbl_df对象的第一个组件。

简单的解决方案

正如@DavidArenburg在对问题的评论中提到的那样,这个问题的dplyr解决方案只是使用filter()如下:

filter(normal, md == md)

其中第一个引用具有该名称的对象md的列(组件),第二个引用包含要匹配的字符串模式的本地字符向量:。tbl_dfmd"-01-01"

更长的版本

您不能使用tbl_dfs 或标准data.frames 像这样的任意值进行索引。

您需要提供R 语言定义中列出的所需索引类型之一。

您可以像这样索引对象的行名,这似乎是您正在尝试的,但其中的值md 不是行名dplyr的开发人员明确地将行名移动为数据集中的一列,然后在对象上设置空行名(然后在输出左侧显示为 1、2、3、...等) .

要执行您想要的操作,您需要获取md与目标匹配的逻辑向量"-01-01"或匹配的索引的数字向量:

ind <- normal[, "md"] %in% md
## or: ind <- normal[, "md"] == md is ok here as md is length 1
normal[ind, "meanA"]

或者

ind <- which(normal[, "md"] %in% md)
normal[ind, "meanA"]

后者显然是一个额外的冗余步骤,但说明任何一种类型的索引都是可以的。

于 2015-07-27T20:37:02.430 回答