读取一些XML文件后,我将创建一个具有特定列名的data.table,例如名称,分数,奖牌等。但是,我对如何根据给定的标准将单列(请参见代码和结果)分成许多列感到困惑。
在我看来,我们要么需要一个带有一个步骤的循环,要么需要一个特殊的功能,但是我不知道到底是什么功能:/
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
这是1375的前20行的示例
这里是data.table的外观。我需要的是将这些结果分为“名称”列(例如Sergei konyagin),国家/地区(例如苏联),问题1-8的得分(分别为8列)和奖牌。我认为,我编写的周期应该从第11步中提取出来(因为每个名称,国家/地区等每11行重复一次),将现有列中的值转换为新值。不幸的是,它不起作用:/
在此先感谢您的帮助!
答案 0 :(得分:0)
试一下。
首先,加载所需的软件包:
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) ]