通过向量将数据框突变,该向量应与变量名称匹配

时间:2020-09-09 15:52:08

标签: r dplyr

我有一个数据载体,其中包含一个年份向量和几列,其中包含特定时间点不同国家/地区的gdp_per_head_values。我想对该数据框进行更改,以获得一个仅包含由年份向量定义的特定时间点的变量值的变量。

我的data.frame看起来像这样:

set.seed(123)
dataset <- tibble('country' = c('Austria','Austria','Austria','Germany','Germany','Sweden','Sweden','Sweden'),
                  'year_vector' = floor(sample(c(1940,1950,1960),8,replace=T)),
                  '1940' = runif(8,15000,18000),
                  '1950' = runif(8,15000,18000),
                  '1960' = runif(8,15000,18000),
)

如上所述,如何通过变量gpd_head更改该数据框

编辑:输出应类似于

set.seed(123)
 dataset <- tibble('country' = c('Austria','Austria','Austria','Germany','Germany','Sweden','Sweden','Sweden'),
                   'year_vector' = floor(sample(c(1940,1950,1960),8,replace=T)),
                   '1940' = runif(8,15000,18000),
                   '1950' = runif(8,15000,18000),
                   '1960' = runif(8,15000,18000)) %>% 
     mutate(gdp_head =c(.$'1940'[1],.$'1940'[2],.$'1960'[3],
                        .$'1950'[4],.$'1940'[5],.$'1960'[6],
                        .$'1960'[7],.$'1950'[8]  ))


       

2 个答案:

答案 0 :(得分:1)

这是一种方法:

首先,由于您要比较year_vector列和列名(将是字符),因此也可以将year_vector转换为字符:

dataset$year_vector <- as.character(dataset$year_vector)

您当前已经定义了tibble-但是,如果您将其定义为纯data.frame,则可以基于[行,列]矩阵进行子集并将匹配的结果添加为gdp_head

dataset <- as.data.frame(dataset)
dataset$gdp_head <- as.numeric(dataset[cbind(1:nrow(dataset), match(dataset$year_vector, names(dataset)))])

答案 1 :(得分:0)

我想出了以下可行的解决方案:

dataset %>% 
do(.,mutate(.,gdp_head  = pmap(list(1:nrow(.), year_vector),
function(x,y) .[x,(y-1901+16)]) %>%
unlist() ))

在此解决方案中,我只是将第一年变量的位置添加到列索引中,然后从year_vector中减去该数字。在这种情况下,年份变量始于1901年,其列索引对应于16。