正在解析 XML 文件以在 R 中进行聚类

Parsing XML file for clustering in R

我正在尝试解析此 XML 文件以将其用于 R 中的聚类:

<root>
  <event>
    <name>apache</name>
    <ip_source>188.185.15.192</ip_source>
    <date>02:17:45</date>
    <request>GET3</request>
    <status>200</status>
    <len>7965</len>
  </event>
  <event>
    <name>apache</name>
    <ip_source>157.90.39.64</ip_source>
    <date>02:30:01</date>
    <request>GET2</request>
    <status>200</status>
    <len>964</len>
  </event>
  <event>
    <name>apache</name>
    <ip_source>115.78.92.20</ip_source>
    <date>02:34:03</date>
    <request>GET1</request>
    <status>404</status>
    <len>295</len>
  </event>
 </root>

所以我在R中使用了以下代码:

library("XML")
df <- xmlToDataFrame("file.xml" ,stringsAsFactors = FALSE)
distance  <- adist(df)
hc <- hclust(as.dist(distance))
groups<-cutree(hc, k=2)
result= df$date[groups==1]
result

我得到的结果是:

[1] "02:17:45" "02:34:03" NA         NA         NA  

问题是我不明白为什么会出现 NA,结果我想要一个只有第一个项目“02:17:45”和第二个项目“02:34:03”的列表,像这样:

[1] 02:17:45 02:34:03

我该怎么做?

df 有 3 行,组的长度为 6。当我们进行 groups==1 观察时,组的 1 和 3 为真,因此匹配日期对象 返回但观察 4,5 和 6 不存在于 df 因此 NA

   df
   #    name      ip_source     date request status  len
   #1 apache 188.185.15.192 02:17:45    GET3    200 7965
   #2 apache   157.90.39.64 02:30:01    GET2    200  964
   #3 apache   115.78.92.20 02:34:03    GET1    404  295


   groups
   # name ip_source      date   request    status       len 
   #    1         2         1         1         1         1 

   groups==1
   #name ip_source      date   request    status       len 
   #TRUE     FALSE      TRUE      TRUE      TRUE      TRUE 

   df[groups==1,]
   #       name      ip_source     date request status  len
   #1    apache 188.185.15.192 02:17:45    GET3    200 7965
   #3    apache   115.78.92.20 02:34:03    GET1    404  295
   #NA     <NA>           <NA>     <NA>    <NA>   <NA> <NA>
   #NA.1   <NA>           <NA>     <NA>    <NA>   <NA> <NA>
   #NA.2   <NA>           <NA>     <NA>    <NA>   <NA> <NA>

当我们按 df 的长度限制组向量时,您会得到预期的结果。这对你来说够吗

  df[groups[1:nrow(df)]==1,"date"]
  #[1] "02:17:45" "02:34:03"