2016-03-06 3 views
0

Ниже приведен код, который я использую для чтения XML-файла и создания фрейма данных из атрибутов в XML-файле. Тем не менее, я небольшой вопрос с кодом. Here - образец данных.Имя столбца R в объекте заменяется на имя объекта

Когда я конвертировать первый список с именем attribact в dataframe имени k1, столбец с именем x в списке изменяется на k1. То же самое происходит с последней строкой кода data1 <- cbind(k1,k2). Здесь имя столбца k1 (с предыдущего шага) изменено на data1 Другими словами, одно из имен столбцов в списке заменяется именем объекта, которому назначается список.

plans <- xmlParse(file1) 
idNodes <- getNodeSet(plans, "//person[@id]") 
ids <- lapply(idNodes, function(x) xmlAttrs(x)['id']) 
attribact <- vector("list", length(ids)*14) 
k <- 1 
for (i in 1:length(ids)) 
{ 
    act <- xpathApply(idNodes[[i]], path = paste("//person[@id=", as.numeric(ids[[i]]),"]//plan[@selected='yes']//act|leg", sep=""), xmlAttrs) 
    for (j in 1:length(act)) 
    { 
    attribact[[k]] <- c(act[[j]],ids[[i]]) 
    k <- k+1  
    } 
} 
attribact <- attribact[attribact!='NULL'] 
k1 <- t(as.data.frame(attribact)) 
data1 <- k1 
+0

Вы уверены, что код и цифра необходимы? Не могли бы вы предоставить нам три строки данных и минимальный код для воспроизведения (одной) проблемы (одновременно)? –

+0

@ RomanLuštrik Есть две причины. Во-первых, я не знал, повлияли ли на более поздние шаги в коде некоторые из предыдущих шагов. Во-вторых, я хочу ускорить мой код, и поэтому мысль, представляющая полный код, может помочь мне получить некоторые рекомендации по производительности. – Gandalf

+0

Я укоротил сообщение. Но, данные много строк длинны (даже для одного случая). Итак, я просто разместил ссылку. – Gandalf

ответ

1

Я думаю, что есть лучшие способы сделать это, но, чтобы дать вам быстрый ответ, который должен работать повторно использовать код, Жюст изменить конец

Ваш код

library(XML) 
plans <- xmlParse(file1) 
idNodes <- getNodeSet(plans, "//person[@id]") 
ids <- lapply(idNodes, function(x) xmlAttrs(x)['id']) 
attribact <- vector("list", length(ids)*14) 
k <- 1 
for (i in 1:length(ids)) 
{ 
    act <- xpathApply(idNodes[[i]], path = paste("//person[@id=", as.numeric(ids[[i]]),"]//plan[@selected='yes']//act|leg", sep=""), xmlAttrs) 
    for (j in 1:length(act)) 
    { 
    attribact[[k]] <- c(act[[j]],ids[[i]]) 
    k <- k+1  
    } 
} 
attribact <- attribact[attribact!='NULL'] 

Затем сделайте

data <- t(do.call(cbind, attribact)) 

Это то, что вы хотите?

head(data) 
#>  type link x    y    start_time end_time 
#> [1,] "home" "21258" "334867.243653" "3126570.70778" "03:00:00" "15:07:00" 
#> [2,] "shop" "13904" "332634.86999" "3127078.96383" "15:12:00" "16:21:00" 
#> [3,] "shop" "14129" "331666.364904" "3129306.48785" "16:25:00" "17:37:00" 
#> [4,] "home" "21258" "334867.243653" "3126570.70778" "17:45:00" "26:59:00" 
#> [5,] "home" "21256" "334598.361546" "3126269.05167" "03:00:00" "07:56:00" 
#> [6,] "work" "14057" "335957.065395" "3128105.16619" "08:04:00" "10:28:00" 
#>  id   
#> [1,] "10000061" 
#> [2,] "10000061" 
#> [3,] "10000061" 
#> [4,] "10000061" 
#> [5,] "10000302" 
#> [6,] "10000302" 
+0

Да, это то, что я хочу. Можете ли вы пролить свет на то, почему имя объекта заменяет имя столбца? Кроме того, вы упомянули о лучших способах достижения этого. Можете ли вы дать какое-то направление этому? Первоначально у моего сообщения было 2 вопроса, в которых второй вопрос требует улучшения моего кода, поскольку он очень медленный для моих целей. Однако мне пришлось сократить его благодаря комментариям мод. – Gandalf

+0

Хорошо, я вижу проблему. Даже мой код получает тот же результат, что и ваш. Но когда я нажимаю на созданный набор данных из среды Rstudio и отображаю его в Rstudio, столбец с именем «x» отображается как имя объекта. – Gandalf

Смежные вопросы