聚合 R 中通配符上的列

Aggregate columns on a wildcard in R

我正在查看记录房屋挂牌天数的房地产数据。在数据 (link) 中,您会看到以 YYYY.MM 形式表示年份和月份的列。当我将此数据导入 R 时,列以相同的方式列出,但前面有一个 'X' (XYYYY.MM)。理想情况下,我想获得数据中每年(例如 2010.01 到 2010.12)的房屋上市天数的中位数。使用前面的示例,我将取 2010.01 到 2010.12 各列的中位数,并为每年生成一个名为“2010.median.days.listed”的结果变量。在 R 中有这样做的好方法吗?

您可以试试下面的代码:

dta <- read.csv("http://files.zillowstatic.com/research/public/State/DaysOnZillow_Public_State.csv")
require(reshape2)
dta <- melt(dta, id.vars = c(1:5))
dta$year <- substr(dta$variable, 2, 5)

dta_results <- aggregate(dta$value, FUN = mean, list(dta$year))

首先你把你的数据变成长格式,然后你 select year 或者你想要的任何其他东西,比如 year + state 然后得到你的 table 通过分组因素(年/年 + 州等)的任意组合的手段、总和或其他任何东西:

> head(dta_results)
  Group.1        x
1    2010 128.0370
2    2011 126.1191
3    2012 122.5372
4    2013 109.1042
5    2014 102.4921
6    2015       NA

几乎肯定有更优雅的方法来做到这一点,但为了快速修复,您可以使用 R 的 grepl 功能轻松地对代表给定年份的所有列进行子集化,例如:

dataURL = "http://files.zillowstatic.com/research/public/State/DaysOnZillow_Public_State.csv"
data = read.csv(dataURL)

year = 2010

cols = data[, grepl(year, names(data)) ]  # select columns of the data whose
                                         # column name contains the pattern
                                         # given in the variable "year", here
                                         # "2010"

我假设您想要这 12 列中每一行的中值(例如,您想要的“2010.median.days.listed”列的第二行将包含 12 个 "Alaska" 值的中值从 2010 年开始)。那是对的吗?

如果是这样,您可以使用 apply: apply(cols, 1, median)。这采用函数 median 并将其应用于 cols 的每一行。第二个参数 (1) 表示我们希望按行应用函数。