问题描述
我有一个带有多个字符串输入的数据框。这些输入中的某些代表相同类别的项目,例如apple
和banana
都属于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
这很好,但是存在多个问题:
-
写起来很笨拙。我必须为
rawdata
的每一列编写这些单独的函数,因为在我的实际数据集中,有多个不同的条目(出于我的目的)实际上是同一件事,但输入的内容不同。在我的示例中,这就是为什么我将apple
和banana
都更改为fruit
的原因。有没有更简单的方法将可能的数据条目分配给它们各自的整数? -
我必须有多个数据帧,每个关系表一个。是否有一种更简单的方法来存储此数据,也许是在带有一列列表的单个数据框中?我尝试了此操作,但在给定
rawdata
中的列名和整数key
的情况下,无法弄清楚如何检索正确的条目。 -
在我
left_join
数据之后,剩下重复的列。为了select
,我必须指定food = val.x
和drink = val.y
。当我加入50-60列时,这可能会变得非常麻烦。如果我做left_join(switch_backfood,by c("food" = "key"))
时,将原始food
列简单地替换为switchback_food
表中的相应字符串,那就很好了。
对于简化将字符串转换为整数然后根据关系表中存储的数据返回不同字符串的过程,是否有任何建议?
我不想使用因素,因为实际上,我的数据框中的值不是apple
和banana
,而是相当长且具有描述性的值,例如laparoscopic approach with open assist and unplanned conversion to open
。这些在操作我的数据时非常笨拙,并且引用整数键要容易得多。另外,我希望用户可以选择更改关系表,如果他/她想更改数据的显示方式而不必与实际数据混淆。
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)