Ошибки, связанные с столбцами фрейма данных при слиянии
Следующий фрагмент кода должен загружать и готовить наборы данных из указанного каталога для дальнейшего анализа данных. Проблема в том, что при попытке объединить данные (один для каждой опции слияния) код генерирует следующие ошибки. Я смущен тем, что здесь происходит. Однако мое чувство кишки говорит мне, что ошибки могут быть связаны с отсутствием имен столбцов в некоторых кадрах данных. Буду признателен за разъяснение. Кроме того, пожалуйста, сообщите предпочтительный вариант слияния (между # 1 и # 2). Спасибо!
ОБНОВЛЕНИЕ 2 (переработано с минимальным воспроизводимым примером, предыдущие версии удалены):
Текущая ошибка (опция слияния 1 включена):
Error in fix.by(by.x, x) : 'by' must specify a uniquely valid column
Текущая ошибка (опция "Слияние 2" ):
Error in `[.data.frame`(x, rep.int(NA_integer_, nyy), nm.x, drop = FALSE) : undefined columns selected
Необходимые пакеты: нет, кроме стандартных.
Исходный код (включает воспроизводимые данные):
# load the datasets of transformed data
# real data
#dataSets <- loadDataSets(SRDA_DIR)
# reproducible example data
# (generated via `dput(lapply(dataSets, head))`, thanks to @MrFlick)
dataSets <- list(structure(list(`NA` = c("284", "284", "284", "284", "284",
"284"), `NA` = c("490", "490", "490", "490", "490", "490")), .Names = c(NA_character_,
NA_character_), SQL = structure("ClNFTEVDVCBnLmdyb3VwX2lkLCB1LnVzZXJfaWQKRlJPTSBzZjA1MTQuZ3JvdXBzIGcsIHNmMDUxNC51c2VycyB1LCBzZjA1MTQucHJvamVjdF9oaXN0b3J5IHBoLCBzZjA1MTQucHJvamVjdF90YXNrIHB0LCBzZjA1MTQucHJvamVjdF9ncm91cF9saXN0IHBnbApXSEVSRSBwaC5wcm9qZWN0X3Rhc2tfaWQgPSBwdC5wcm9qZWN0X3Rhc2tfaWQKQU5EIHB0Lmdyb3VwX3Byb2plY3RfaWQgPSBwZ2wuZ3JvdXBfcHJvamVjdF9pZApBTkQgZy5ncm91cF9pZCA9IHBnbC5ncm91cF9pZApBTkQgcGgubW9kX2J5ID0gdS51c2VyX2lk", class = "base64"), indicatorName = structure("Y29udHJpYlBlb3BsZQ==", class = "base64"), resultNames = structure("TkE=", class = "base64"), row.names = c(NA,
6L), class = "data.frame"), structure(list(`Project ID` = c("85684",
"172552", "228484", "173865", "94140", "179097"), Enabled = c("1",
"1", "1", "1", "1", "1"), `Repo URL` = c("http://svn.tr51.org/svn/variomat/trunk/",
"http://svn.hyperic.org/?root=Hyperic+SIGAR", "http://code.google.com/p/ufolder/source/browse",
"https://svn.canoo.com/trunk/webtestclipse/", "http://www.rasilon.net/svn/sptools/trunk/sptools",
"http://trac.pocoo.org/repos/pygments"), `Repo Instructions` = c("Login is currently disabled.",
"For anonymous access, simply issue the command 'svn co http://svn.hyperic.org/projects/sigar' For developer access, send email to sourceforge user "hyperic".",
"Anonymous browsing", "https://svn.canoo.com/trunk/webtestclipse/",
"SVN stuff to go here. If you just want a copy of the source, run svn co http://www.rasilon.net/svn/sptools/trunk/sptools",
"The Subversion repository is at http://trac.pocoo.org/repos/pygments."
)), .Names = c("Project ID", "Enabled", "Repo URL", "Repo Instructions"
), SQL = structure("ClNFTEVDVCBncm91cF9pZCwgZW5hYmxlZCwgdXJsX3ByaW1hcnksIGluc3RydWN0aW9uc19wdWJsaWMKRlJPTSBzZjA1MTQuZXh0ZXJuYWxfdG9vbF9saW5rcw==", class = "base64"), indicatorName = structure("ZGV2TGlua3M=", class = "base64"), resultNames = structure("UHJvamVjdCBJRCwgRW5hYmxlZCwgUmVwbyBVUkwsIFJlcG8gSW5zdHJ1Y3Rpb25z", class = "base64"), row.names = c(NA,
6L), class = "data.frame"), structure(list(`NA` = c("1343228",
"230959", "1938195", "1883362", "404683", "650286"), `NA` = c("6",
"6", "6", "6", "6", "6"), `NA` = c("http://sourceforge.net/p/aprpg/discussion",
"http://sourceforge.net/project/memberlist.php?group_id=230959",
"http://www.polishavenue.com", "http://sourceforge.net/p/wakemypc/tickets",
"http://sourceforge.net/apps/trac/graphz/", "http://testando1"
)), .Names = c(NA_character_, NA_character_, NA_character_), SQL = structure("ClNFTEVDVCBncm91cF9pZCwgcHJlZmVycmVkX3N1cHBvcnRfdHlwZSwgcHJlZmVycmVkX3N1cHBvcnRfcmVzb3VyY2UKRlJPTSBzZjA1MTQuZ3JvdXBzCldIRVJFIHByZWZlcnJlZF9zdXBwb3J0X3R5cGUgPSA2", class = "base64"), indicatorName = structure("ZGV2U3VwcG9ydA==", class = "base64"), resultNames = structure("TkE=", class = "base64"), row.names = c(NA,
6L), class = "data.frame"), structure(list(`Project ID` = c("1692507",
"1095949", "685064", "900864", "976917", "1949934"), `Development Team Size` = c(1,
1, 1, 1, 1, 1)), .Names = c("Project ID", "Development Team Size"
), SQL = structure("ClNFTEVDVCBncm91cF9pZCwgQ09VTlQodXNlcl9pZCkKRlJPTSBzZjA1MTQudXNlcl9ncm91cApXSEVSRSBncmFudGN2cyA9IDEKR1JPVVAgQlkgZ3JvdXBfaWQ=", class = "base64"), indicatorName = structure("ZGV2VGVhbVNpemU=", class = "base64"), resultNames = structure("UHJvamVjdCBJRCwgRGV2ZWxvcG1lbnQgVGVhbSBTaXpl", class = "base64"), row.names = c(NA,
6L), class = "data.frame"), structure(list(`NA` = c("1844416",
"1849571", "1850512", "1850521", "1854556", "1855148"), `NA` = c("0",
"0", "0", "0", "0", "0"), `NA` = c("1", "1", "1", "1", "1", "1"
)), .Names = c(NA_character_, NA_character_, NA_character_), SQL = structure("ClNFTEVDVCBncm91cF9pZCwgdXNlX3dpa2ksIHVzZV9mb3J1bQpGUk9NIHNmMDUxNC5ncm91cHM=", class = "base64"), indicatorName = structure("ZG1Qcm9jZXNz", class = "base64"), resultNames = structure("TkE=", class = "base64"), row.names = c(NA,
6L), class = "data.frame"), structure(list(`Project ID` = c("2107960",
"2068039", "2156229", "2068032", "2068046", "2081469"), `Project Age` = c(5,
6.5, 4, 6.5, 6.5, 6)), .Names = c("Project ID", "Project Age"
), row.names = c(NA, 6L), class = "data.frame"), structure(list(
`Project ID` = c("708994", "1586967", "581072", "738614",
"758081", "782990"), `Project License` = structure(c(1L,
1L, 1L, 1L, 1L, 1L), .Label = c("", "afl", "apache", "apache2",
"artistic", "boostlicense", "bsd", "cddl", "eclipselicense",
"educom", "fair", "gpl", "ibm", "ibmcpl", "iosl", "jabber",
"lgpl", "mit", "mpl", "mpl11", "ms-rl", "nasalicense", "ncsa",
"nethack", "none", "nposl3", "osl", "other", "php", "php-license",
"psfl", "public", "publicdomain", "python", "qpl", "sissl",
"sunpublic", "website", "wxwindows", "zlib", "zope"), class = "factor"),
`License Restrictiveness` = structure(c(NA_integer_, NA_integer_,
NA_integer_, NA_integer_, NA_integer_, NA_integer_), .Label = c("Highly Restrictive",
"Permissive", "Restrictive", "Unknown"), class = "factor")), .Names = c("Project ID",
"Project License", "License Restrictiveness"), SQL = structure("ClNFTEVDVCBncm91cF9pZCwgbGljZW5zZQpGUk9NIHNmMDUxNC5ncm91cHM=", class = "base64"), indicatorName = structure("cHJqTGljZW5zZQ==", class = "base64"), resultNames = structure("UHJvamVjdCBJRCwgUHJvamVjdCBMaWNlbnNl", class = "base64"), row.names = c(NA,
6L), class = "data.frame"), structure(list(`Project ID` = c("2",
"3", "7", "11", "12", "14"), `Latest Release` = c("Snapshots",
"7.5", "gedit 0.9.5", "r2-00", "0.9.7", "dhiggen_merge-5.0"),
`Project Maturity` = structure(c(NA, 3L, 1L, 3L, 1L, 3L), .Label = c("Alpha/Beta",
"Stable", "Mature"), class = "factor")), .Names = c("Project ID",
"Latest Release", "Project Maturity"), SQL = structure("ClNFTEVDVCBmcC5ncm91cF9pZCwgTUFYKGZyLm5hbWUpCkZST00gc2YwNTE0LmZyc19wYWNrYWdlIGZwLCBzZjA1MTQuZnJzX3JlbGVhc2UgZnIsIHNmMDUxNC5mcnNfc3RhdHVzIGZzCldIRVJFIGZwLnBhY2thZ2VfaWQgPSBmci5wYWNrYWdlX2lkCkdST1VQIEJZIGZwLmdyb3VwX2lk", class = "base64"), indicatorName = structure("cHJqTWF0dXJpdHk=", class = "base64"), resultNames = structure("UHJvamVjdCBJRCwgTGF0ZXN0IFJlbGVhc2U=", class = "base64"), row.names = c(NA,
6L), class = "data.frame"), structure(list(`NA` = c("1660372",
"1590394", "1590772", "85777", "1591062", "1591181"), `NA` = c("0",
"0", "0", "0", "0", "0")), .Names = c(NA_character_, NA_character_
), SQL = structure("ClNFTEVDVCBncm91cF9pZCwgdXNlX3dpa2kKRlJPTSBzZjA1MTQuZ3JvdXBz", class = "base64"), indicatorName = structure("cHViUm9hZG1hcA==", class = "base64"), resultNames = structure("TkE=", class = "base64"), row.names = c(NA,
6L), class = "data.frame"), structure(list(ID = c("141", "66",
"55", "45", "75", "80"), `Software Type` = c("Clustering", "Database",
"Desktop", "Development", "Financial", "Games")), .Names = c("ID",
"Software Type"), SQL = structure("ClNFTEVDVCB0cm92ZV9jYXRfaWQsIGRlc2NyaXB0aW9uCkZST00gc2YwNTE0LnRyb3ZlX2Zyb250cGFnZQ==", class = "base64"), indicatorName = structure("c29mdHdhcmVUeXBl", class = "base64"), resultNames = structure("SUQsIFNvZnR3YXJlIFR5cGU=", class = "base64"), row.names = c(NA,
6L), class = "data.frame"), structure(list(`Project ID` = c("142",
"129", "120", "119", "107", "106"), `User Community Size` = c("153237",
"3299", "135710", "16249", "6042", "2508")), .Names = c("Project ID",
"User Community Size"), SQL = structure("ClNFTEVDVCBncm91cF9pZCwgZG93bmxvYWRzCkZST00gc2YwNTE0LnN0YXRzX3Byb2plY3RfYWxs", class = "base64"), indicatorName = structure("dXNlckNvbW11bml0eVNpemU=", class = "base64"), resultNames = structure("UHJvamVjdCBJRCwgVXNlciBDb21tdW5pdHkgU2l6ZQ==", class = "base64"), row.names = c(NA,
6L), class = "data.frame"))
# Merging Option 1
flossData <- data.frame(dataSets[[1]][1])
# merge all loaded datasets by common column ("Project ID")
silent <- lapply(seq(2, length(dataSets) - 1),
function(i) {merge(flossData, dataSets[[1]][i],
by = "Project ID",
all.y = TRUE)})
# Merging Option 2
#flossData <- Reduce(function(...)
# merge(..., by.x = "row.names", by.y = "Project ID", all = TRUE),
# dataSets)
# Additional Transformations
# convert presence of Repo URL to integer
flossData[["Repo URL"]] <- as.integer(flossData[["Repo URL"]] != "")
# convert License Restrictiveness' factor levels to integers
#flossData[["License Restrictiveness"]] <-
# as.integer(flossData[["License Restrictiveness"]])
# convert User Community Size from character to integer
flossData[["User Community Size"]] <-
as.integer(flossData[["User Community Size"]])
# remove NAs
#flossData <- flossData[complete.cases(flossData[,3]),]
rowsNA <- apply(flossData, 1, function(x) {any(is.na(x))})
flossData <- flossData[!rowsNA,]
Окружающая среда:
> sessionInfo()
R version 3.1.1 (2014-07-10)
Platform: x86_64-pc-linux-gnu (64-bit)
locale:
[1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C LC_TIME=C
[4] LC_COLLATE=C LC_MONETARY=C LC_MESSAGES=C
[7] LC_PAPER=C LC_NAME=C LC_ADDRESS=C
[10] LC_TELEPHONE=C LC_MEASUREMENT=C LC_IDENTIFICATION=C
attached base packages:
[1] stats graphics grDevices utils datasets methods base
other attached packages:
[1] plspm_0.4.1 turner_0.1.7 tester_0.1.7 diagram_1.6.2 shape_1.4.1 amap_0.8-12
loaded via a namespace (and not attached):
[1] tools_3.1.1
ОБНОВЛЕНИЕ 3:
Попытка объединить фреймы данных с помощью пакета reshape (reshape::merge_all(dataSets)
) привела к следующему сообщению об ошибке: Error: cannot allocate vector of size 332.8 Gb
. Это довольно странно, учитывая, что общий размер объектов R, хранящихся в этом каталоге и объединенных, составляет всего 4,3 МБ.
Попытка объединить данные fames с использованием пакета plyr (plyr::join_all(dataSets)
) привела к следующему сообщению об ошибке: Error in ``[.data.frame``(x, by) : undefined columns selected
. Кажется, что это соответствует сообщению об ошибке в Варианте слияния 2.
Ответы
Ответ 1
lapply(dataSets, names)
pids = which(sapply(dataSets, FUN=function(x) { 'Project ID' %in% names(x) }))
acc = dataSets[[pids[1]]]
for (id in pids[2:length(pids)]) {
acc = merge(acc, dataSets[[id]], by='Project ID', all=T)
}
Предположения, которые я должен был сделать:
- не все наборы данных из
dataSet
имеют столбец Project ID
, поэтому предполагается, что вам нужно присоединиться только к тем, у кого оно есть. Поэтому сначала я нахожу их и помещаю их индексы в pids
- так как есть наборы данных, которые не имеют общих идентификаторов проекта, я предположил, что вы хотите выполнить внешнее объединение -
all=T
флаг в merge
Что касается вашего вопроса о том, каким образом присоединиться к использованию, я бы сказал, что это не очень хорошая идея в R. Я бы использовал RDBMS, когда это было возможно, чтобы делать соединения и другие вещи перед загрузкой данных в R