通过rowname访问数据框给我NA而不是我期望的值

时间:2015-07-27 20:17:29

标签: r dataframe dplyr rowname

这是一个例子。 normal是一个数据框,其rownames等于未指定年份的月份和日期(例如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不会在这里采用rowname的值,因为它们都是唯一的?

1 个答案:

答案 0 :(得分:3)

摘要

简而言之,显示的对象的md列中的值 tbl_df对象的rownames,并使用字符向量索引行的工作原理rownames,而不是tbl_dfdata.frame的任意组成部分。

此外,您似乎认为normal是一个数据框;它不是,它是类tbl_df的一个对象,只有data.frame类继承。这通常不会产生任何差异,但是如下所述,tbl_df对象没有rownames,原始数据框中的任何rownames都转换为tbl_df的第一个组件对象

简单解决方案

正如 @DavidArenburg 在对该问题的评论中提到的,此问题的 dplyr 解决方案只是使用filter(),如下所示:

filter(normal, md == md)

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

更长的版本

您不能使用"-01-01"和标准tbl_df这样的任意值进行索引。

您需要提供R Language Definition中列出的所需索引类型之一。

您可以将此类对象的rownames编入索引,这就是您尝试的内容,但data.frame 中的值不是rownames ; dplyr 的开发人员明确地将rownames移动到数据集中的一列,然后在对象上设置null rownames(然后显示为1,2,3,...等等)左侧输出)。

要做你想做的事,你需要得到一个匹配目标md的{​​{1}}逻辑向量或匹配的索引的数字向量:

md

"-01-01"

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