Как отделить столбец data.table с учетом условий - PullRequest
0 голосов
/ 22 декабря 2018

После прочтения некоторых XML-файлов я должен создать таблицу данных с конкретными именами столбцов, например, Имя, Оценка, Медаль и т. Д. Однако я не совсем понимаю, как следует отделить один столбец (см. Код ирезультаты) во многие с заданными критериями.

На мой взгляд, нам нужен либо цикл с шагом, либо специальная функция, но я не знаю, какая именно: /

stage1 <- read_html("1973.html")
stage2 <- xml_find_all(stage1, ".//tr")
xml_text(stage2)
stage3 <- xml_text(xml_find_all(stage2, ".//td"))
stage3

DT <- data.table(stage3, keep.rownames=TRUE, check.names=TRUE, key=NULL, 
stringsAsFactors=TRUE)

for (i in seq(from = 1, to = 1375, by = 11)){ 
  if (is.numeric(DT[i,stage3] = FALSE)){ 
    DT$Name <- DT[i,stage3] 
  } 
}

https://pp.userapi.com/c845220/v845220632/1678a5/IRykEniYiiA.jpg

Это пример первых 20 строк 1375

Вот как выглядит data.table сейчас.Что мне нужно, это разделить эти результаты на столбцы «Имя» (например, Сергей Конягин), Страна (например, СССР), баллы за задачи 1–8 (8 столбцов соответственно) и медаль.Я думаю, что цикл, который я написал, должен быть извлечен с шагом 11 (поскольку каждое имя, страна и т. Д. Повторяет каждые 11 строк) значения из существующего столбца и переносит его в новый.К сожалению, это не работает: /

Заранее спасибо за помощь!

1 Ответ

0 голосов
/ 22 декабря 2018

Сделайте это.

Сначала загрузите необходимые пакеты:

library (data.table)
library (stringr) # this is just for the piping operator %>%

Вы бы прочли здесь в своей таблице данных, я создаю одну в качестве примера:

dat =  c( "Sergey","USSR",1,2,3,4,5,6,7,8,"silver") %>% rep (125) %>% data.table 
setnames (dat, "stage3")

В качестве краткого примечания, я бы не стал читать в ваших строках такие факторы, как вы в своем собственном коде, потому что тогда это может испортить преобразование в числовое значение.

Это будет повторятьсяСам заполнить таблицу.это работает, только если ваша таблица не пропускает значения.Кроме того, не рекомендуется иметь имена столбцов в виде чисел, лучше давать им собственные имена, такие как «test1», «test2» и т. д .:

dat [, metadata := c ("name","country",1:8,"medal") ] # whatever you want to name your future 11 columns
dat [, participant :=  1: (.N / 11) %>% rep (each = 11) ] # same idea, can't have missing rows

Теперь, если возможно, измените форму и преобразуйте строки в числовые:

new.dat =
 dcast (dat, participant ~ metadata, value.var = "stage3") [, lapply (.SD, type.convert) ]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...