3

嗨,我是 R 新手,有一个问题。我有一个 data.frame (df),其中包含 1960-2012 年约 100 个不同国家/地区的约 30 种不同类型的统计数据。这是它的外观示例:

     Country      Statistic.Type     1960      1961      1962      1963 ...  2012 
__________________________________________________________________________________
1    Albania      Death Rate          10        21        13        24        25  
2    Albania      Birth Rate          7         15        6         10        9  
3    Albania      Life Expectancy     8         12        10        7         20  
4    Albania      Population          10        30        27        18        13
5    Brazil       Death Rate          14        20        22        13        18
6    Brazil       Birth Rate          ...  
7    Brazil       Life Expectancy     ...  
8    Brazil       Population          ...  
9    Cambodia     Death Rate          ...  
10   Cambodia     Birth Rate          ...                  etc...

请注意,总共有 55 列,53 年列中的每一列中的值都是为本问题的目的而组成的。

我需要帮助编写一个函数,该函数将国家和统计类型作为输入,并返回一个新的 data.frame,其中包含 2 列,显示给定国家和统计类型的年份和每年的值。例如,如果我在函数中输入 country=Brazil 和 statistic.type=Death Rate,新的 data.frame 应该如下所示:

     Year    Value 
_____________________
1    1960     14
2    1961     20
3    1962     22
...
51   2012     18

我不知道如何做到这一点,如果有人可以给我任何想法/代码/包来安装,那将非常有帮助。

太感谢了!

4

3 回答 3

1

如果df是你的data.frame,你只需要这样:

f <- function(country, statistic.type, data=df)
{
 values <- data[data$Country==country & data$Statistic.Type==statistic.type,-(1:2)]

 cbind(Year=names(df)[-(1:2)], Value=values)
}

用它作为

f(country="Brazil", statistic.type="Death Rate")
于 2013-05-18T21:03:02.523 回答
0

您可以将,subsetstack,结合起来,gsub只留下年份列中的数字:

df <- expand.grid(
  "country" = c("A", "B"),
  "statistic" =  c("c", "d", "e", "f"),
  stringsAsFactors = FALSE)

df$year1980 <- rnorm(8)
df$year1990 <- rnorm(8)
df$year2000 <- rnorm(8)


getYears <- function(input, cntry, stat) {
  x <- subset(input, country == cntry & stat == statistic,
    select = -c(country, statistic))
  x <- stack(x)[,c("ind", "values")]
  x$ind <- gsub("\\D", "", x$ind)
  x
}


getYears(df, "A", "c")

   ind     values
1 1980  1.1421309
2 1990  1.0777974
3 2000 -0.2010913
于 2013-05-18T21:16:43.917 回答
0

您可能必须对总数据集进行一些拆分操作才能拥有国家/地区单独的数据集。 https://stat.ethz.ch/pipermail/r-help/2008-February/155328.html

然后对每个数据子集使用melt函数。在您的情况下,改编自 http://www.statmethods.net/management/reshape.html,其中 mydata 是已经拆分的数据:

    % example of melt function 
    library(reshape)
    mdata <- melt(mydata, id=c("Year"))

这就对了。

于 2013-05-18T21:09:44.423 回答