Вот решение, использующее tidyr::pivot_wider()
.
textFile <- "Protocol|Info
DNS|Standard query reponse 0x0800 AAA ppa.launchpad.net
TCP|35478 > 80 [SYN] Seq=0 Win=29200 Len=0
TCP|80 > 42936 [ACK] Seq=1 Ack=208 Win=30080
HTTP|HTTP/1.1 304 Not Modified
TCP|42936 > 80 [ACK] Seq=208, Ack=212 Win=30336 Len=0
HTTP|GET /ubuntu/dists/xenial-updates/InRelease HTTP/1.1"
df <- read.csv(text = textFile,header = TRUE,stringsAsFactors = FALSE,
sep = "|",row.names = NULL)
id <- 1:nrow(df)
df <- cbind(id,df)
library(tidyr)
df %>% pivot_wider(id_cols = id,
names_from = Protocol,
values_from = Info)
... и вывод:
# A tibble: 6 x 4
id DNS TCP HTTP
<int> <chr> <chr> <chr>
1 1 Standard query reponse 0… NA NA
2 2 NA 35478 > 80 [SYN] Seq=0… NA
3 3 NA 80 > 42936 [ACK] Seq=1… NA
4 4 NA NA HTTP/1.1 304 Not Modifi…
5 5 NA 42936 > 80 [ACK] Seq=2… NA
6 6 NA NA GET /ubuntu/dists/xenia…
>
Обратите внимание, что, поскольку данные примера не документируют какую-либо связь между строками во входном файле, я присвоил id
столбец, чтобы гарантировать, что строка в исходном фрейме данных назначена одной и только одной строке фрейма данных широкого формата.