如何在给定条件下分隔data.table列

时间:2018-12-22 15:09:52

标签: r

读取一些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行重复一次),将现有列中的值转换为新值。不幸的是,它不起作用:/

在此先感谢您的帮助!

1 个答案:

答案 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) ]