создать цикл для получения выборок в сгруппированных данных, которые удовлетворяют условию - PullRequest
0 голосов
/ 05 июля 2019

У меня есть датафрейм, где данные сгруппированы по идентификатору. Мне нужно знать, сколько клеток составляют 10% в каждой группе, чтобы выбрать это число в образце, но в этом образце следует выбрать ячейки, для которых EP равно 1.

Я пытался сделать вложенный цикл For: один для того, чтобы узнать количество ячеек, которые составляют 10% для каждой группы, и большее число для выборки этого числа, удовлетворяющее условию EP == 1

x <- data.frame("ID"=rep(1:2, each=10),"EP" = rep(0:1, times=10))
x
   ID EP
1   1  0
2   1  1
3   1  0
4   1  1
5   1  0
6   1  1
7   1  0
8   1  1
9   1  0
10  1  1
11  2  0
12  2  1
13  2  0
14  2  1
15  2  0
16  2  1
17  2  0
18  2  1
19  2  0
20  2  1

for(j in 1:1000){
  for (i in 1:nrow(x)){
    d <- x[x$ID==i,]
    npix <- 10*nrow(d)/100
  }
  r <- sample(d[d$EP==1,],npix)
  print(r)
}
data frame with 0 columns and 0 rows
data frame with 0 columns and 0 rows
data frame with 0 columns and 0 rows
.
.
.
until 1000

Я хотел бы получить этот фрейм данных, где каждая выборка находится в новом столбце в x, а ячейка выборки имеет "1":

   ID EP s1 s2....s1000
1   1  0 0  0 ....
2   1  1 0  1
3   1  0 0  0
4   1  1 0  0
5   1  0 0  0
6   1  1 0  0
7   1  0 0  0
8   1  1 0  0
9   1  0 0  0
10  1  1 1  0
11  2  0 0  0
12  2  1 0  0
13  2  0 0  0
14  2  1 0  1
15  2  0 0  0
16  2  1 0  0
17  2  0 0  0
18  2  1 1  0
19  2  0 0  0
20  2  1 0  0

см., Что каждый 1 в S1 и s2 является ячейками выборки и соответствует 10% ячеек в каждой группе (1, 2), которые удовлетворяют условию EP == 1

Ответы [ 2 ]

2 голосов
/ 05 июля 2019

можно попробовать

set.seed(1231)
x <- data.frame("ID"=rep(1:2, each=10),"EP" = rep(0:1, times=10))

library(tidyverse)
x %>% 
  group_by(ID) %>% 
  mutate(index= ifelse(EP==1, 1:n(),0)) %>% 
  mutate(s1 = ifelse(index %in% sample(index[index!=0], n()*0.1), 1, 0)) %>% 
  mutate(s2 = ifelse(index %in% sample(index[index!=0], n()*0.1), 1, 0))
# A tibble: 20 x 5
# Groups:   ID [2]
      ID    EP index    s1    s2
   <int> <int> <dbl> <dbl> <dbl>
 1     1     0     0     0     0
 2     1     1     2     0     0
 3     1     0     0     0     0
 4     1     1     4     0     0
 5     1     0     0     0     0
 6     1     1     6     1     1
 7     1     0     0     0     0
 8     1     1     8     0     0
 9     1     0     0     0     0
10     1     1    10     0     0
11     2     0     0     0     0
12     2     1     2     0     0
13     2     0     0     0     0
14     2     1     4     0     1
15     2     0     0     0     0
16     2     1     6     0     0
17     2     0     0     0     0
18     2     1     8     0     0
19     2     0     0     0     0
20     2     1    10     1     0
1 голос
/ 05 июля 2019

Мы можем написать функцию, которая дает нам 1, которые составляют 10% для каждого ID, и размещаем его там, где EP = 1.

library(dplyr)
 rep_func <- function() {
   x %>%
    group_by(ID) %>%
    mutate(s1 = 0,
           s1 = replace(s1, sample(which(EP == 1), floor(0.1 * n())), 1)) %>%
    pull(s1)
}

, затем используйте replicate, чтобы повторить его n раз

n <- 5
x[paste0("s", seq_len(n))] <- replicate(n, rep_func())

x
#   ID EP s1 s2 s3 s4 s5
#1   1  0  0  0  0  0  0
#2   1  1  0  0  0  0  0
#3   1  0  0  0  0  0  0
#4   1  1  0  0  0  0  0
#5   1  0  0  0  0  0  0
#6   1  1  1  0  0  1  0
#7   1  0  0  0  0  0  0
#8   1  1  0  1  0  0  0
#9   1  0  0  0  0  0  0
#10  1  1  0  0  1  0  1
#11  2  0  0  0  0  0  0
#12  2  1  0  0  1  0  0
#13  2  0  0  0  0  0  0
#14  2  1  1  1  0  0  0
#15  2  0  0  0  0  0  0
#16  2  1  0  0  0  0  1
#17  2  0  0  0  0  0  0
#18  2  1  0  0  0  1  0
#19  2  0  0  0  0  0  0
#20  2  1  0  0  0  0  0
...