Было бы лучше создать ваши данные следующим образом (тот же результат, но вы не получите случайные именованные векторы в вашей глобальной среде):
users_df <- data.frame(
user = c("User1", "User2", "User1", "User3","User4", "User5", "User3", "User6", "User7", "User8", "User5"),
place = c("PlaceA", "PlaceA", "PlaceB", "PlaceB", "PlaceC", "PlaceC", "PlaceC", "PlaceC", "PlaceD", "PlaceD", "PlaceD"))
Затем используйте базовую функцию split
у которого есть метод для фреймов данных:
group_by_user <- split(users_df, users_df$user)
group_by_user #output not included
sapply( group_by_user, function(df) length( unique(df$place) ) )
User1 User2 User3 User4 User5 User6 User7 User8
2 1 2 1 2 1 1 1
Альтернативное использование, если требуется счетчик place
:
> grouped_data <- split(users_df, users_df$place)
> grouped_data
$PlaceA
user place
1 User1 PlaceA
2 User2 PlaceA
$PlaceB
user place
3 User1 PlaceB
4 User3 PlaceB
$PlaceC
user place
5 User4 PlaceC
6 User5 PlaceC
7 User3 PlaceC
8 User6 PlaceC
$PlaceD
user place
9 User7 PlaceD
10 User8 PlaceD
11 User5 PlaceD
Затем вы можете выбрать place
имя, например так:
> grouped_data[['PlaceB']]
user place
3 User1 PlaceB
4 User3 PlaceB
Или вы можете перебрать список информационных фреймов следующим образом:
lapply( grouped_data, nrow)
$PlaceA
[1] 2
$PlaceB
[1] 2
$PlaceC
[1] 4
$PlaceD
[1] 3
> sapply( grouped_data, nrow)
PlaceA PlaceB PlaceC PlaceD
2 2 4 3