所以下面的函数使用了一个非常大的数据帧。 这个DF的两列是房屋建造的年份,另一列是成本。
我想输入列名,在本例中为 ds$Build 作为函数参数
YearCount <- 唯一值数的长度,年份,以 DS$Build 为单位
YearList <- 唯一值的向量,年份,以 ds$Built 为单位
然后我希望它对 YearCount 迭代次数进行 for 循环,其中它采用 Cost06 中值的中位数,但仅当 ds$Built 中的值 = YearList 中的值时[i]
取结果中位数并将其附加到空向量 CostVec
最后,制作一个 2 列数据帧 年份列表 和 iMedian.
但这行不通。它正在执行您在下面看到的操作,它将相同的中值(循环中最后一次迭代的值)分配给所有年份,而不是提供每年的结果。
我是新手,所以非常感谢您的耐心等待。
Median.DF <- function(x)
{
YearCount <- length(unique(x))
YearList <- unique(x)
CostVec <- c()
for (i in YearCount) {
imedian <- median(ds[x == YearList,"COST06"],na.rm = TRUE)
CostVec <- append(CostVec,imedian)
}
MedianCost.data <- data.frame(YearList, CostVec)
return(MedianCost.data)
}
YearList CostVec
1 2004 1629
2 2007 1629
3 2005 1629
4 1980 1629
5 1985 1629
6 2003 1629
7 2008 1629
8 1990 1629
9 1975 1629
10 1970 1629
11 1950 1629
12 1920 1629
13 1960 1629
14 1930 1629
15 1919 1629
16 1940 1629
17 1995 1629
18 2006 1629
19 2009 1629
20 2000 1629
21 2002 1629
22 2001 1629
23 2010 1629
24 2011 1629
25 2012 1629
26 2013 1629
这是一个更好(更干净,更像R)的方法。我会把它留给你把它变成函数。
df <- data.frame(YearList=sample(2000:2006,30, replace=T), CostVec=10^3+100*runif(30,0,1))
dfSplit <- split(df, df$YearList)
medianByYears <- lapply(dfSplit, function(x) median(x$CostVec))
medianByYearsClean <- do.call(rbind, medianByYears)
data.frame(Years=rownames(medianByYearsClean), MedianPrices=medianByYearsClean, row.names=NULL)
其他一些提示:
在编写函数之前,只需在函数外部逐行测试每一行即可。这里的主要问题是:
for (i in YearCount) { do stuff }
类似于
for (i in 5){print(i)}
只做一件事一次。你想做:
for (i in seq(YearCount)) { do stuff }