我有一个数据载体,其中包含一个年份向量和几列,其中包含特定时间点不同国家/地区的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] ))
答案 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。