首页 > 解决方案 > 我应该如何有效地按值标记数据框的行?

问题描述

我有一个旅行数据框,其中有一列显示旅行是如何进行的,类似于下面的“a”列。

我的目标是根据列“a”的值向每一行添加一个新的数据列。

下面的函数有效,但似乎是完成一个相当简单的目标的过于复杂的方法。

new_var <- 0似乎可能会导致错误。

如果我不附加数据框并以这种方式调用列,则该函数不起作用,这显然不是很好。

有没有明显更好的方法来做到这一点?

a <- c("On the Subway", "On a train", "Driving","On the Subway", "On a train", "Driving","On the Subway", "On a train", "Driving")
b <- c(1,15,3,54,5,32,7,76,9)
my_dataframe <- data.frame(a,b)

new_var <- 0
carbon_func <- function(variable){

  new_var[variable == 'On the subway'] <- 0.014
  new_var[variable == 'On a train'] <- 0.014
  new_var[variable == 'On a bus'] <- 0.068
  new_var[variable == 'Motorcycling'] <- 0.072
  new_var[variable == 'Driving'] <- 0.12
  new_var[variable == 'In a taxi or rideshare'] <- 0.12
  new_var[variable == 'Flying'] <- 0.285
  new_var[variable == 'Cycling'] <- 0
  new_var[variable == 'Walking'] <- 0

  return(new_var)

}

attach(my_dataframe)
my_dataframe$Carbon_Footprint <- carbon_func(a)
detach(my_dataframe)

我已经探索过使用像下面这样的字典类型的东西,但还没有找到可以替代所发布内容的方法

standardized_footprints <- c(0.014, 0.014, 0.068, 0.072, 0.12, 0.12, 0.285)
names(standardized_footprints) <- c('On the subway', 'On a train', 'On a bus', 'Motorcycling', 'Driving', 'In a taxi or rideshare', 'Flying')

谢谢!

标签: r

解决方案


使用命名向量,我们可以匹配列以获取值

my_dataframe$Carbon_Footprint <- standardized_footprints[as.character(my_dataframe$a)]
my_dataframe$Carbon_Footprint
#[1] 0.014 0.014 0.120 0.014 0.014 0.120 0.014 0.014 0.120

但是,需要注意的一件事是名称应该与列值匹配以进行精确匹配。如果我们有条目On the subway并且实际值为On the Subway,则不匹配。

数据

standardized_footprints <- c(0.014, 0.014, 0.068, 0.072, 0.12, 0.12, 0.285)
names(standardized_footprints) <- c('On the Subway', 'On a train', 
         'On a bus', 'Motorcycling', 'Driving', 'In a taxi or rideshare', 'Flying')

推荐阅读