Мы можем использовать pivot_wider
library(dplyr)
library(tidyr)
library(lubridate)
df1 %>%
arrange(Name, mdy(Date)) %>%
group_by(Name) %>%
mutate(rn = c('x', 'y', 'z')[row_number()]) %>%
ungroup %>%
pivot_wider(names_from = rn, values_from = c(Item, Date), names_sep=".")%>%
select(Name, ends_with('x'), ends_with('y'), ends_with('z'))
# A tibble: 4 x 7
# Name Item.x Date.x Item.y Date.y Item.z Date.z
# <chr> <chr> <chr> <chr> <chr> <chr> <chr>
#1 PersonA Pear 1/1/12 Banana 1/1/13 Apple 1/1/14
#2 PersonB Orange 1/1/15 <NA> <NA> <NA> <NA>
#3 PersonC Grapes 1/1/12 Kiwi 1/1/17 <NA> <NA>
#4 PersonD Lemon 1/1/16 <NA> <NA> <NA> <NA>
данные
df1 <- structure(list(Name = c("PersonA", "PersonA", "PersonA", "PersonB",
"PersonC", "PersonC", "PersonD"), Item = c("Apple", "Banana",
"Pear", "Orange", "Kiwi", "Grapes", "Lemon"), Date = c("1/1/14",
"1/1/13", "1/1/12", "1/1/15", "1/1/17", "1/1/12", "1/1/16")),
class = "data.frame", row.names = c(NA,
-7L))