微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

创建和查找键值对的最有效方法

如何解决创建和查找键值对的最有效方法

我有一个带有多个字符串输入的数据框。这些输入中的某些代表相同类别的项目,例如applebanana都属于fruit组。

rawdata <- data.frame(food = c("apple","banana","carrot","steak"),drink = c("water","coke","sprite","milk"))

    food  drink
1  apple  water
2 banana   coke
3 carrot sprite
4  steak   milk

我想首先将它们转换为将用作关系表中的外键的整数:

conv_food <- function(vec) {
  val <- c("apple" = 1L,"banana" = 1L,"carrot" = 2L,"steak" = 3L)
  unname(val[vec])
}

conv_drink <- function(vec) {
  val <- c("water" = 1L,"coke" = 2L,"sprite" = 2L,"milk" = 3L)
  unname(val[vec])
}

cleandata <- rawdata %>% 
  dplyr::mutate(
    food = conv_food(food),drink = conv_drink(drink)
  )

  food drink
1    1     1
2    1     2
3    2     2
4    3     3

接下来,我构建我的关系数据框架:

switchback_food <- data.frame(key = c(1,2,3),val = c("fruit","vegetable","meat"))

switchback_drink <- data.frame(key = c(1,val = c("water","soda","dairy"))

执行左连接并清理变量名,然后仅选择我想要的内容

cleandata %>% 
  dplyr::left_join(switchback_food,by = c("food" = "key")) %>% 
  dplyr::left_join(switchback_drink,by = c("drink" = "key")) %>% 
  dplyr::select(food = val.x,drink = val.y)

       food drink
1     fruit water
2     fruit  soda
3 vegetable  soda
4      meat dairy

这很好,但是存在多个问题:

  1. 写起来很笨拙。我必须为rawdata的每一列编写这些单独的函数,因为在我的实际数据集中,有多个不同的条目(出于我的目的)实际上是同一件事,但输入的内容不同。在我的示例中,这就是为什么我将applebanana都更改为fruit的原因。有没有更简单的方法将可能的数据条目分配给它们各自的整数?

  2. 我必须有多个数据帧,每个关系表一个。是否有一种更简单的方法来存储此数据,也许是在带有一列列表的单个数据框中?我尝试了此操作,但在给定rawdata中的列名和整数key的情况下,无法弄清楚如何检索正确的条目。

  3. 在我left_join数据之后,剩下重复的列。为了select,我必须指定food = val.xdrink = val.y。当我加入50-60列时,这可能会变得非常麻烦。如果我做left_join(switch_backfood,by c("food" = "key"))时,将原始food列简单地替换为switchback_food表中的相应字符串,那就很好了。

对于简化将字符串转换为整数然后根据关系表中存储的数据返回不同字符串的过程,是否有任何建议?

我不想使用因素,因为实际上,我的数据框中的值不是applebanana,而是相当长且具有描述性的值,例如laparoscopic approach with open assist and unplanned conversion to open。这些在操作我的数据时非常笨拙,并且引用整数键要容易得多。另外,我希望用户可以选择更改关系表,如果他/她想更改数据的显示方式而不必与实际数据混淆。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。