grepl与R中的数据块对比

时间:2019-08-09 23:01:56

标签: r dataframe tibble

我正在尝试解析从Excel工作表中读取的某些数据,由于它们位于非标准行中,因此我需要使用grep或为我的数据查找起始行的索引,但是奇怪的结果不同,这取决于我是直接从read_excel中使用小标题还是将其转换为数据帧。

我给出了一个可快速复制的示例:

test_vec<-c("SUMMARY OF PRICE FORECASTS, INFLATION and EXCHANGE RATES                                     ",
"*********************************************************************************************",
"NA                                                                                           ",
"NA                                                                                           ",
"NA                                                                                           ",
"Year                                                                                         ",
"1989 Act                                                                                     ",
"1990 Act") 

这是一个数据文件的前7行中的示例,我需要标识包含“年份”的行。

如果数据存储在小标题中:

test_df<-tibble(test_vec)
grepl("Year",test_df[,1]) 
grepl("Year",test_df$test_vec) 

然后我得到不同的结果,具体取决于我是对列进行索引还是使用列名:

> test_df<-tibble(test_vec)
>    grepl("Year",test_df[,1]) 
[1] TRUE
>    grepl("Year",test_df$test_vec) 
[1] FALSE FALSE FALSE FALSE FALSE  TRUE FALSE FALSE

现在,添加转换为数据帧的功能相同:

test_df<-data.frame(test_vec,stringsAsFactors = F)
>    grepl("Year",test_df[,1]) 
[1] FALSE FALSE FALSE FALSE FALSE  TRUE FALSE FALSE
>    grepl("Year",test_df$test_vec) 
[1] FALSE FALSE FALSE FALSE FALSE  TRUE FALSE FALSE

如果我先进行小节测试,然后再进行数据帧测试,这将成立。

test_df<-data.frame(tibble(test_vec),stringsAsFactors=F)
>    grepl("Year",test_df[,1]) 
[1] FALSE FALSE FALSE FALSE FALSE  TRUE FALSE FALSE
>    grepl("Year",test_df$test_vec) 
[1] FALSE FALSE FALSE FALSE FALSE  TRUE FALSE FALSE

列名称在数据中不会保持不变,因此我可以通过重命名第一列并在需要时以此索引来解决此问题,例如:

test_df<-tibble(test_vec)
colnames(test_df)[1]<-"fixed_name"
grepl("Year",test_df$fixed_name) 
> [1] FALSE FALSE FALSE FALSE FALSE  TRUE FALSE FALSE

但是,我想我不明白为什么[,1]在小标题中的操作不同于在数据帧中的操作。任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:1)

这是小语的关键特征,如tibble vignette中所述。让我们说明一下:

library(tibble)
test_vec <- c("SUMMARY OF PRICE FORECASTS, INFLATION and EXCHANGE RATES                                     ","*********************************************************************************************","NA                                                                                           ","NA                                                                                           ","NA                                                                                           ","Year                                                                                         ","1989 Act                                                                                     ","1990 Act") 
test_tbl <- tibble(test_vec)
test_df <- data.frame(test_vec, stringsAsFactors = F)

如果您使用$进行索引,则始终为小标题和data.frames返回向量:

class(test_tbl$test_vec)
#> [1] "character"
class(test_df$test_vec)
#> [1] "character"

但是,如果您使用[进行索引,则小标题总是返回小标题,而data.frame可以返回向量。具体来说,它将单列输出简化为向量。

class(test_tbl[, 1])
#> [1] "tbl_df"     "tbl"        "data.frame"
class(test_df[, 1])
#> [1] "character"

如果您只知道列索引而不是名称,并且只想返回一列,则可以使用[[从数据帧和小对象中返回向量。如果您使用dplyr,则pull[[相同,用于本地数据。

class(test_tbl[[1]])
#> [1] "character"
class(test_df[[1]])
#> [1] "character"
class(dplyr::pull(test_tbl, 1))
#> [1] "character"

reprex package(v0.3.0)于2019-08-09创建