I've tried a few solutions but they don't fit into this use case. I've got 32 GB of RAM and I'm still hitting the ceiling when cast, dcast, or spread are used. I looped to find a list and it took more than 24 hours to do a portion of the 42 million rows I have. I'd like a base solution using the apply family, but I understand if that's not gonna work... I feel like it won't since I have to query the following row to determine if the addressID matches (or if the data.frame is unsorted, it has to search the rest of the column).
Here's an example of a (sorted) data.frame:
 LINCOLN LINCOLN
 HYUNDAI TOYOTA SUBARU
 HYUNDAI HYUNDAI
aggregate(addressID ~ MAKE, data = df, c)
work for you?
by(df, df[,"addressID"], c)
will give you a list