子集数据帧变量通过部分名称

时间:2014-05-20 08:08:22

标签: r loops subset

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

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}

2 个答案:

答案 0 :(得分:1)

这不是一个循环,但如果您的数据对于每个国家/地区的格式始终相同,那么每个国家/地区都有3列,并且您始终希望对每个国家/地区的第一列进行操作,您可以尝试这样做:< / p>

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

答案 1 :(得分:1)

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

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