R编程新手! - 中位环功能损坏

问题描述 投票:1回答:1

所以下面的函数使用了一个非常大的数据帧。这个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 function loops median
1个回答
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 }
© www.soinside.com 2019 - 2024. All rights reserved.