Я пытаюсь разбить вектор строк на объект data.frame и для фиксированного порядка это не проблема (например, как написано here), но в моем конкретном случае столбцы для будущего фрейма данных в строковых объектах не завершены. Это, как результат должен выглядеть для ввода игрушек:strsplit в data.frame с неполным вводом
input <- c("an=1;bn=3;cn=45",
"bn=3.5;cn=76",
"an=2;dn=5")
res <- do.something(input)
> res
an bn cn dn
[1,] 1 3 45 NA
[2,] NA 3.5 76 NA
[3,] 2 NA NA 5
Ищу теперь для функции do.something
, что может сделать это в эффективном способе. Моим наивным решением на данный момент было бы перебрать входные объекты, strsplit
те для ;
, затем strsplit
их снова за =
, а затем заполнить data.frame
результат по результату. Есть ли способ сделать это более R-одинаковым? Я боюсь, что этот элемент за элементом займет довольно много времени для длинного вектора input
.
EDIT: Просто для полноты картины, мое наивное решение выглядит следующим образом:
do.something <- function(x){
temp <- strsplit(x,";")
temp2 <- sapply(temp,strsplit,"=")
ul.temp2 <- unlist(temp2)
label <- sort(unique(ul.temp2[seq(1,length(ul.temp2),2)]))
res <- data.frame(matrix(NA, nrow = length(x), ncol = length(label)))
colnames(res) <- label
for(i in 1:length(temp)){
for(j in 1:length(label)){
curInfo <- unlist(temp2[[i]])
if(sum(is.element(curInfo,label[j]))>0){
res[i,j] <- curInfo[which(curInfo==label[j])+1]
}
}
}
res
}
EDIT2: К сожалению, мои большой ввод данные выглядят следующим образом (данные без '=' возможно):
input <- c("an=1;bn=3;cn=45",
"an;bn=3.5;cn=76",
"an=2;dn=5")
, поэтому я не могу сравнить данные ответы на мою проблему. Мое наивное решение для этого -
do.something <- function(x){
temp <- strsplit(x,";")
tempNames <- sort(unique(sapply(strsplit(unlist(temp),"="),"[",1)))
res <- data.frame(matrix(NA, nrow = length(x), ncol = length(tempNames)))
colnames(res) <- tempNames
for(i in 1:length(temp)){
curSplit <- strsplit(unlist(temp[[i]]),"=")
curNames <- sapply(curSplit,"[",1)
curValues <- sapply(curSplit,"[",2)
for(j in 1:length(tempNames)){
if(is.element(colnames(res)[j],curNames)){
res[i,j] <- curValues[curNames==colnames(res)[j]]
}
}
}
res
}
Ваши имена столбцов всегда два символа? –
Хорошо, извините, что вводит в заблуждение. Нет, это не так. Они могут быть от 2 до 10 персонажей. –
Я отредактировал мое решение.Теперь он использует только базовый пакет и должен эффективно обрабатывать недостающие номера. –