【问题标题】:R - Function to create a data.frame containing manipulated data from another data.frameR - 创建一个 data.frame 的函数,其中包含来自另一个 data.frame 的操作数据
【发布时间】:2013-05-18 17:52:55
【问题描述】:

您好,我是 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 年的列中的值都是为本问题的目的而编造的。

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

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

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

非常感谢!

【问题讨论】:

  • 请阅读本文并提供您的数据的最小可重现示例stackoverflow.com/questions/5963269/…
  • 嗨@user2397274,如果您认为您的问题已得到满意回答,您能否考虑接受以下答案之一? :-)

标签: r


【解决方案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")

【讨论】:

    【解决方案2】:

    您可能必须对整个数据集进行一些拆分操作,才能拥有国家/地区单独的数据集。 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"))
    

    就是这样。

    【讨论】:

      【解决方案3】:

      您可以将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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-09-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-03-14
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多