I have a data frame like so:
Name Position Value
a 1 0.2
a 3 0.4
a 4 0.3
b 1 0.5
b 2
You could use data.table
library(data.table)
DT <- data.table(df)
setkey(DT, Position)
DT[, .SD[J(1:5), roll=FALSE], by=Name][order(Name, Position),]
# Name Position Value
#1: a 1 0.2
#2: a 2 NA
#3: a 3 0.4
#4: a 4 0.3
#5: a 5 NA
#6: b 1 0.5
#7: b 2 0.4
#8: b 3 NA
#9: b 4 NA
#10: b 5 0.3
#11: c 1 NA
#12: c 2 0.3
#13: c 3 0.4
#14: c 4 NA
#15: c 5 0.1
#16: d 1 0.2
#17: d 2 0.4
#18: d 3 0.5
#19: d 4 NA
#20: d 5 NA
Or you can use tidyr/dplyr
library(dplyr)
library(tidyr)
df %>%
spread(Position, Value) %>%
gather(Position, Value, `1`:`5`) %>%
arrange(Name, Position)
df <- structure(list(Name = c("a", "a", "a", "b", "b", "b", "c", "c",
"c", "d", "d", "d"), Position = c(1L, 3L, 4L, 1L, 2L, 5L, 2L,
3L, 5L, 1L, 2L, 3L), Value = c(0.2, 0.4, 0.3, 0.5, 0.4, 0.3,
0.3, 0.4, 0.1, 0.2, 0.4, 0.5)), .Names = c("Name", "Position",
"Value"), class = "data.frame", row.names = c(NA, -12L))