【发布时间】:2018-10-17 14:00:59
【问题描述】:
我正在尝试迁移数据库并希望使用 R 来协助迁移。作为迁移过程的一部分,我需要更新“项目 ID”,因为它们已更改。我创建了一个函数来将旧 ID 映射到新 ID:
old_to_new <- function(id, df) {
return (df[which(df$Old == id), ]$New)
}
但是,每当我尝试应用它来在我的数据框中添加一个新列(从数据库表加载)时:
library(tidyverse)
library(RODBC)
cn <- odbcDriverConnect(connection="Driver={SQL Server Native Client 11.0};server=xxx;database=xxx;uid=xxx;pwd=xxx;")
df <- sqlQuery(cn, "SELECT * FROM [MaintDB_New].[dbo].[Priority]")
ticket_df <- sqlQuery(cn, "SELECT * FROM [MaintDB_New].[dbo].[Tickets]")
ticket_details_df <- sqlQuery(cn, "SELECT * FROM [MaintDB_New].[dbo].[Ticket_Details]")
new_items <- read_csv("./ticket_itm_export_temp.csv", col_names = c("Old", "Name", "New"))
ticket_df_new <- ticket_df %>% mutate(item_id = old_to_new(itemID, new_items))
我收到以下错误:
Error in `[[<-.data.frame`(`*tmp*`, col, value = c(NA_integer_, NA_integer_, :
replacement has 280 rows, data has 69430
In addition: Warning message:
In df$Old == id :
longer object length is not a multiple of shorter object length
我做错了什么,正确的方法是什么。我在尝试使用 ddplyr 时收到了类似的错误。
我是 R 新手,所以如果这是一个明显的问题,我深表歉意。
编辑 - 添加数据结构:
head(ticket_df)
ticketID propertyID itemID roomNumber assignedToID isOpen openID latestID
1 11 10 1 <NA> NA 0 22 23
2 12 17 1 <NA> NA 0 24 289
3 13 17 1 <NA> NA 0 25 292
4 14 17 17 <NA> NA 0 26 4411
5 15 17 68 <NA> NA 0 27 296
6 16 17 74 <NA> NA 0 28 294
head(new_items)
Old Name New
<int> <chr> <int>
1 257 Register Cash Drawers 425
2 253 Alarm System 426
3 135 CREDENZA/ ARMOIRE 427
4 55 Back Office PC 428
5 183 Backup All Data 429
6 260 Base Boards 430
【问题讨论】:
-
我建议只做一个
left_join,类似ticket_df %>% left_join(new_items, by = c("id" == "Old")) %>% mutate(item_id = New)。还要确保new_items没有重复的Old条目,否则您最终会得到比开始时更多的行。如果这不起作用,请发布可重现的示例数据,以便我们了解发生了什么。使用dput为我们提供相关数据帧的前 10 行的复制/粘贴版本(看起来像ticket_df和new_items是相关的)。 -
谢谢,格雷戈尔。我不相信这对我有用。我已经为第一个数据帧添加了 head 的输出。
-
您的数据仍然不完整:帧之间没有任何东西可以联系在一起(没有共同的“关键”)。 (请使用
dput。) -
关于可重现问题的一件事:代表性数据需要表明您试图展示的行为。在这种情况下,
ticket_df$itemId和new_items$Old之间没有匹配项,因此我们可能处理的任何代码都不会执行任何操作。 (我试图根据找到任何匹配的列来推断“键”。感谢您澄清底层数据结构,所以我们现在只需要一个更具代表性的数据样本......请使用dput。) -
我通过更改您的示例数据(在问题中)为我们提供匹配来回答。通常,许多人在问题中避开链接(例如,Dropbox)有两个原因:(1)由于病毒等风险而犹豫下载随机二进制文件; (2) 当这些链接失效时,这个问题不再是可重现的。目标是尽可能地封装在问题文本中。这建议将示例数据和代码修剪到演示问题所需的最小限度。