【问题标题】:subset dataframe variables through part of names通过部分名称子集数据框变量
【发布时间】:2014-05-20 08:08:22
【问题描述】:

假设我有一个包含这些系列和其他内容的数据框。

其中RuUk 是国家代码。

Date CPI.Ru CPI.g.Ru CPI.s.Ru CPI.Uk CPI.g.Uk CPI.s.Uk
Q4-1990 61.4    66.4    67.5    72.2    68.2    32.4
Q1-1991 61.3    67.0    68.0    72.6    68.8    33.2
Q2-1991 61.4    67.5    68.1    73.2    69.5    35.1
Q3-1991 61.7    68.7    68.9    73.7    70.6    35.9
Q4-1991 62.3    68.4    69.3    74.3    71.9    38.2
Q1-1992 62.3    69.7    69.6    74.7    72.9    39.2
Q2-1992 62.1    70.3    70.0    75.3    73.7    40.6
Q3-1992 62.2    71.4    70.5    75.3    74.1    41.2
Q4-1992 62.5    71.1    70.9    75.7    74.3    44.0

我想按国家/地区对dataframe 进行子集化,然后对这个系列做点什么。

例如,我想将每个国家/地区的 CPI 索引除以其第一个元素。

我怎样才能在循环或应用功能中做到这一点?

countries <- c("Ru","Uk")
for (i in countries)
{dataFrameName$CPI.{i} <- dfName$CPI.{i}/dfName$CPI.{i}[1]}

我应该写什么而不是{i}

【问题讨论】:

    标签: r loops subset


    【解决方案1】:

    $ 只接受固定的列名。要根据表达式选择列,您可以使用双括号:

    countries <- c("Ru", "Uk")
    for (i in countries){
        x <- paste0("CPI.", i)
        dfName[[x]] <- dfName[[x]]/dfName[[x]][1]
    }
    

    【讨论】:

      【解决方案2】:

      这不是一个循环,但如果您的数据对于每个国家/地区始终具有相同的形式,因此每个国家/地区有 3 列,并且您总是希望对每个国家/地区的第一列进行操作,您可以尝试以下操作:

      sub <- df[,seq(2,ncol(df), 3)]   #create a subsetted data.frame containing the CPI index per country
      
      apply(sub, 2, function(x) x/x[1])    #then use apply to operate on each column
      
      
      #         CPI.Ru   CPI.Uk
      # [1,] 1.0000000 1.000000
      # [2,] 0.9983713 1.005540
      # [3,] 1.0000000 1.013850
      # [4,] 1.0048860 1.020776
      # [5,] 1.0146580 1.029086
      # [6,] 1.0146580 1.034626
      # [7,] 1.0114007 1.042936
      # [8,] 1.0130293 1.042936
      # [9,] 1.0179153 1.048476
      

      【讨论】:

        猜你喜欢
        • 2019-12-30
        • 1970-01-01
        • 1970-01-01
        • 2018-05-27
        • 1970-01-01
        • 2019-06-24
        • 1970-01-01
        • 1970-01-01
        • 2020-01-11
        相关资源
        最近更新 更多