R编程新手! - Median Loop Function Broken

时间:2018-01-02 01:07:09

标签: r function loops median

所以下面的函数使用了一个非常大的数据帧。这个DF的两列是建造房屋的年份,另一列是成本。

我想输入列名,在这种情况下,ds $ Built作为函数参数

YearCount< - DS $ Built

中唯一值的数量长度,年数

YearList< - ds $ Built

中唯一值的向量,年

然后我希望它执行YearCount迭代次数的for循环,其中它取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

1 个答案:

答案 0 :(得分:0)

这是一种更好(更干净,更像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 }