R 编程使用 "dplyr" 到 select 行和 return 找到的行的索引

R Programming using "dplyr" to select rows and return the index of the rows found

Setup/Problem:

使用 dplyr - 我无法确定 return 筛选行的行索引的最佳方式,因为 opposed 到 returning 筛选行的内容。

问题:

我可以使用 dplyr::filter() 从数据框中提取行...问题是想要提取过滤行的索引值并将其添加到满足的索引条目列表中搜索条件。

问题:

有没有一种简单的方法可以根据特定条件使用 dplyr 搜索数据框,return 找到每行的数字索引?下面的代码使用 r::which() 将索引行提取到列表中...

    requiredPackages <- c("dplyr")

    ipak <- function(pkg){
            new.pkg <- pkg[!(pkg %in% installed.packages()[, "Package"])]
            if (length(new.pkg))
                    install.packages(new.pkg, dependencies = TRUE)
            sapply(pkg, require, character.only = TRUE)
    }

    ipak(requiredPackages)

    if (!file.exists("./week3/data")) {
            dir.create("./week3/data")
    }

    # CSV Download
    if (!file.exists("./week3/data/americancommunitySurvey.csv")) {
            fileUrl <- "https://d396qusza40orc.cloudfront.net/getdata%2Fdata%2Fss06hid.csv?accessType=DOWNLOAD"
            download.file(fileUrl, destfile = "./week3/data/americancommunitySurvey.csv", method = "curl")
    }

    housingData <- tbl_df(read.csv("./week3/data/americancommunitySurvey.csv"
                                   , stringsAsFactors = TRUE))

 Now we have to extract the relevant data
#
# Create a logical vector that identifies the households on greater than 10
# acres who sold more than ,000 worth of agriculture products. Assign that
# logical vector to the variable agricultureLogical. Apply the which() function
# like this to identify the rows of the data frame where the logical vector is
# TRUE. which(agricultureLogical) What are the first 3 values that result?
#
# ACR 1
# Lot size
# b .N/A (GQ/not a one-family house or mobile home)
# 1 .House on less than one acre
# 2 .House on one to less than ten acres
# 3 .House on ten or more acres                 ACR == 3
#
# AGS 1
# Sales of Agriculture Products
# b .N/A (less than 1 acre/GQ/vacant/
#                 .2 or more units in structure)
# 1 .None
# 2 .$ 1 - $ 999
# 3 .$ 1000 - $ 2499
# 4 .$ 2500 - $ 4999
# 5 .$ 5000 - $ 9999
# 6 .000+                                    AGS == 6
#
# Thus, we need to select only the results that have a ACR == 3 AND a AGS == 6
#
agricultureLogical <- which(housingData$ACR == 3 & housingData$AGS == 6)
agricultureLogical
# Now we can display the first three values of the resulting list
head(agricultureLogical[1:3])

上面的代码给出了我想要的结果,但我想了解如何使用 dplyr 执行此操作。这让我很烦恼...我可以使用 dplyr::filter() 如下所示来提取行 - 如何提取找到的每一行的索引????

agricultureLogical <- filter(housingData, ACR == 3 & housingData$AGS == 6)

R 设置

版本 _
平台 x86_64-apple-darwin13.4.0
拱门 x86_64
osdarwin13.4.0
系统x86_64, darwin13.4.0
状态
专业 3
未成年人 1.2
2014 年
第 10 个月
第 31 天
svn 版本 66913
语言 R
version.stringR 版本 3.1.2 (2014-10-31) 昵称南瓜头盔

dplyr 版本 0.3.0.2

设置 Mac OS X

型号名称:MacBook Pro 型号标识符:MacBookPro10,1 处理器名称:Intel Core i7 处理器速度:2.7 GHz 处理器数量:1 核心总数:4 L2 缓存(每核心):256 KB 三级缓存:8 MB 内存:16 GB

建议的解决方案

这是我正在尝试做的事情的示例...这是一种解决方案,但我不喜欢它。感谢 Richard Scriven 提供指向 1:n()...

的指针

手动将索引列添加到数据框...

我还没有想出如何 return 为符合一组特定条件的每一行单独的索引号...

所以我使用 dplyr:mutate() 在示例数据框中添加了一个索引列。然后,我在数据框上使用 dplyr::filter() 来根据所需条件应用过滤器。这给我留下了我想玩的行列表......包括原始数据框的索引......我现在使用 dplyr::select()为满足条件的每一行仅提取原始数据框条目的索引列...

h1 <- housingData
# Add an index column to the dataframe h1...
h1 <- mutate(h1, IDX = 1:n())
# Filter the h1 dataframe using the criteria defined...
h1 <- filter(h1, ACR == 3 & housingData$AGS == 6)
# Extract the index 
h1 <- select(h1, IDX)
# Convert to an integer list...
agricultureLogical <- as.integer(as.character(h1$IDX))
head(agricultureLogical[1:3])

以上对我来说是重复的工作,因为索引隐含在原始数据框中。因此,我的感觉是必须有一种方法可以 return 过滤器识别的项目的索引集...感谢回答:-)

如果您使用的是 dplyr >= 0.4,您可以执行以下操作

housingData %>%
  add_rownames() %>%
  filter(ACR == 3 & AGS == 6) %>%
  `[[`("rowname") %>%
  as.numeric() -> agricultureLogical

虽然你为什么会认为这是对

的改进
agricultureLogical <- which(housingData$ACR == 3 & housingData$AGS == 6)

逃避我。

由于 add_rownames() 已弃用,您可以使用 rownames_to_column()。 Ista 的解决方案将采用以下格式:

housingData %>%
rownames_to_column() %>%
filter(ACR == 3 & AGS == 6) %>%
`[[`("rowname") %>%
as.numeric() -> agricultureLogical
housingData %>%
  mutate(test = ACR == 3 & AGS == 6) %>%
  pull(test) %>%
  which

一个更简单的解决方案是使用 with 环绕 which:

agricultureLogical <- housingData %>% with(which(ACR == 3 & AGS == 6))