Я думаю, что вы можете использовать unique
, чтобы найти все возможные идентификаторы/сайты, а затем образец из уникальных и подмножества.
Например, давайте создадим набор данных
# Set the RNG seed for reproducibility
set.seed(12345)
ID <- rep(100:110, c(2, 6, 3, 1, 3, 8, 9, 2, 4, 5, 6))
site <- rep(1:6, c(8, 7, 8, 11, 4, 11))
species <- sample(letters[1:5], length(ID), replace=T)
df <- data.frame(ID=ID, Site=site, Species=species)
Так, ДФ выглядит как:
> head(df, 15)
ID Site Species
1 100 1 d
2 100 1 e
3 101 1 d
4 101 1 e
5 101 1 c
6 101 1 a
7 101 1 b
8 101 1 c
9 102 2 d
10 102 2 e
11 102 2 a
12 103 2 a
13 104 2 d
14 104 2 a
15 104 2 b
Обобщая данные, мы имеем:
Site 1 -> 100, 101
Site 2 -> 102, 103, 104
Site 3 -> 105
Site 4 -> 106, 107
Site 5 -> 108
Site 6 -> 109, 110
Теперь, скажем, я хочу выбрать из 3 сайтов
# The number of sites we want to sample
num.sites <- 3
# Find all the sites
all.sites <- unique(df$Site)
# Pick the sites.
# You may also want to check that num.sites <= length(all.sites)
sites <- sample(all.sites, num.sites)
В этом случае мы выбрали
> sites
[1] 4 5 6
Итак, теперь мы находим идентификаторы, доступные для каждого сайта
# Now find the IDs in each of those sites
# simplify=F is VERY important to ensure we get a list even if every
# site has the same number of IDs
IDs <- sapply(chosen.sites, function(s)
{
unique(df$ID[df$Site==s])
}, simplify=FALSE)
Который дает нам
> IDs
[[1]]
[1] 106 107
[[2]]
[1] 108
[[3]]
[1] 109 110
Теперь выберите один идентификатор каждого сайт
# NOTE: this assumes the same ID is not found in multiple sites
# but it's easy to deal with the opposite case
# Again, we return a list, because sapply does not seem
# to play well with data frames... (try it!)
res <- sapply(IDs, function(i)
{
chosen.ID <- sample(as.list(i), 1)
df[df$ID==chosen.ID,]
}, simplify=FALSE)
# Finally convert the list to a data frame
res <- do.call(rbind, res)
> res
ID Site Species
24 106 4 d
25 106 4 d
26 106 4 b
27 106 4 d
28 106 4 c
29 106 4 b
30 106 4 c
31 106 4 d
32 106 4 a
35 108 5 b
36 108 5 b
37 108 5 e
38 108 5 e
44 110 6 d
45 110 6 b
46 110 6 b
47 110 6 a
48 110 6 a
49 110 6 a
Так что, все в одной функции
pickSites <- function(df, num.sites)
{
all.sites <- unique(df$Site)
chosen.sites <- sample(all.sites, num.sites)
IDs <- sapply(chosen.sites, function(s)
{
unique(df$ID[df$Site==s])
}, simplify=FALSE)
res <- sapply(IDs, function(i)
{
chosen.ID <- sample(as.list(i), 1)
df[df$ID==chosen.ID,]
}, simplify=FALSE)
res <- do.call(rbind, res)
}
Можете ли вы объяснить, почему 'я = 3' означает, что эти' ID's должны быть выбраны и почему '108' отличается от' 102, 103 , 105'? Не могли бы вы показать код, чтобы проиллюстрировать, что вы делаете, какую-то общую настройку. Неясно, что это такое. –
ОК, извините, вот еще какой-то контекст.Я загружаю генерацию кривых накопления видов, используя specaccum() для разных номеров удаленных камер (столбец ID) и разных номеров сайтов (столбец сайта). Поэтому мне нужно, чтобы на одном сайте кривые для одной камеры, двух камер и т. Д., Затем для двух сайтов, кривых для одной камеры, двух камер и т. Д. Мой первый цикл: для (l in 1: length (sitelist)), подмножества в l возможных сайтов и создает список всех возможных камер на этих сайтах. Мой следующий вложенный цикл: for (i in 1: l) - это то, где я хочу пробовать одну камеру, две камеры (с разных сайтов) и т. Д. – user3122022
108 отличается от 102, 103 и 105, потому что он находится на другом сайте (Столбец сайта). Я бы хотел выбрать наугад, один идентификатор с каждого Сайта. Набор данных, который я предоставил, показывает итерацию i = 3 (3 Сайта), другие итерации i (больше сайтов) содержат в них много ID, но я все же хочу только один идентификатор с каждого Сайта независимо от того, насколько велика i (то есть как многие сайты есть). Надеюсь, это имеет смысл. – user3122022