В моем ответе используется много неприятного кодирования (то есть двух вложенных циклов), чтобы найти желаемое решение, но оно дает именно то, что вы хотите:
df <- structure(list(Tag = c("AA", "AB", "AC", "AA", "AB", "AA", "AB",
"AC"), Date = c("1/1/2010", "2/1/2010", "3/1/2010", "4/1/2010",
"5/1/2010", "6/1/2010", "7/1/2010", "8/1/2010")), .Names = c("Tag",
"Date"), class = "data.frame", row.names = c(NA, -8L))
l <- nrow(df)
counter <- 1
cols <- c("AA", "AB", "AC")
fin <- data.frame(AA = NULL, AB = NULL, AC = NULL)
tmp <- data.frame(AA = NA, AB = NA, AC = NA)
while(counter < l) {
tmp <- data.frame(AA = NA, AB = NA, AC = NA)
for (col in 1:3) {
if (df[counter,1] == cols[col]) {
tmp[1,col] <- df[counter,2]
counter <- counter + 1
}
}
fin <- rbind(fin, tmp)
}
fin
дает вам:
AA AB AC
1 1/1/2010 2/1/2010 3/1/2010
2 4/1/2010 5/1/2010 <NA>
3 6/1/2010 7/1/2010 8/1/2010
Обратите внимание, что вы могли бы работать с cols <- unique(sort(df[,1]))
для более общего решения (for (col in 1:3)
и создание fin
и tmp
должно быть соответственно изменено).
Кроме того, это решение совсем не эффективно для памяти или чего-либо еще. Вы добьетесь значительных улучшений, если предварительно назначите и т. Д. (На больших фреймах data.frames), но для быстрого и грязного способа это работает.