聚合 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
) 表示我们希望按行应用函数。
我正在查看记录房屋挂牌天数的房地产数据。在数据 (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
) 表示我们希望按行应用函数。