所以下面的函数使用了一个非常大的数据帧。这个DF的两列是建造房屋的年份,另一列是成本。
我想输入列名,在这种情况下,ds $ Built作为函数参数
YearCount < - DS $ Built中唯一值的数量的长度,年份
YearList < - 唯一值的向量,年,以ds $ Built为单位
然后我希望它执行一个forC循环的YearCount迭代次数,其中它取Cost06中的值的中位数,但只有ds $ Built中的值= YearList [i]中的值
获取生成的中位数并将其附加到空向量CostVec
最后,创建YearList和iMedian的2列数据框。
但这不起作用。它正在执行您在下面所看到的内容,它将相同的中值(循环中的最后一次迭代的值)分配给所有年份,而不是使每年的结果可用。
我是新手,所以非常感谢你的耐心等待。
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 }