Как удалить строки, соответствующие определенным критериям в R - PullRequest
1 голос
/ 16 июня 2020

У меня есть данные моделирования модели популяции, где у меня есть несколько реплик (run_num) с неравным количеством временных шагов в каждом прогоне, где я измеряю выходы длины и яиц (Phys_length & no_eggs).

> head(params)
  run_num time_step phys_length no_eggs
1       1         0 0.000000000       0
2       1         1 0.008209734       0
3       1         2 0.016332967       0
4       1         3 0.024238314       0
5       1         4 0.031594308       0
6       1         5 0.033077672       0

> tail(params)
       run_num time_step phys_length no_eggs
607395      49     13728    15.04109     727
607396      49     13729    15.04111     727
607397      49     13730    15.04112     727
607398      49     13731    15.04113     727
607399      49     13732    15.04114     727
607400      49     13733    15.04115     727
> 


Ни один из прогонов не дает яиц на ранних временных шагах (незрелые особи), но некоторые никогда не начинают производить яйца. Я хочу найти все случаи, когда индивидуум (запуск) никогда не начинает производить яйца, и удалить весь этот запуск из фрейма данных. Мое решение - найти max time_step для каждого запуска и, если no_eggs = 0, удалить весь запуск.

Я новичок в R ie и понятия не имею, с чего начать инструктировать R. Я думаю о l oop, но я застреваю, пытаясь понять, как сказать R, чтобы он смотрел только на max time_step при каждом запуске. Затем, как удалить все строки, у которых есть этот run_number.

Это то, что у меня есть до сих пор, но я не уверен, что нахожусь на правильном пути, поскольку я никогда раньше не работал с циклами for сейчас.

for (val in params$run_num)) {
  if(no_eggs   )
}

Мы приветствуем любые идеи о том, как это сделать.

Ответы [ 3 ]

0 голосов
/ 16 июня 2020

Один из способов продолжить:

  • создать подмножество вашего фрейма данных, состоящее из ненулевых записей no_eggs
  • , вычеркните все num_run записи, соответствующие тем векторы
  • подмножество исходного фрейма данных на основе хороших num_run записей, найденных выше

Ваш набор данных не воспроизводится, поэтому я не могу проверить этот код, но что-то вот так должно работать:

params2 <- params[params$run_num %in% unique(params[params$no_eggs > 0, ]$run_num), ]

Чтобы понять лог c, давайте посмотрим изнутри:

  • params[params$no_eggs > 0, ]$run_num берет фрейм данных params и подмножества он основан на строках, которые имеют no_eggs > 0, затем удаляет вектор run_num из этого подмножества
  • unique(...) записывает список уникальных элементов, найденных выше, который представляет собой список run_num s we wi sh для сохранения
  • params[params$run_num %in% ..., ] создает другое подмножество params, сохраняя только строки с run_num записями, найденные в списке, который мы создали выше, используя unique()
0 голосов
/ 16 июня 2020

Рассмотрим ave для встроенного агрегата с помощью Run группировки, затем подмножества по отмеченным наблюдениям через логические условия, используя ifelse:

# INLINE AGGREGATE
params$max_time_step <- with(params, ave(time_step, run_num, FUN=max))

# FLAG COLUMN
params$max_time_no_eggs <- with(params, ifelse(time_step == max_time_step & no_eggs == 0, 1, 0))

# EXPAND FLAG TO ENTIRE run_num GROUP
params$max_time_no_eggs <- with(params, ave(max_time_no_eggs, run_num, FUN=max))

# SUBSET OUT FLAGGED RECORDS
sub_params <- subset(params, max_time_no_eggs == 0)

# DROP HELPER COLUMNS
params$max_time_step <- NULL
params$max_time_no_eggs <- NULL

sub_params$max_time_step <- NULL
sub_params$max_time_no_eggs <- NULL

Или две строки с использованием диспетчеров контекста, within и transform:

sub_params <- within(params,  {
    # INLINE AGGREGATE
    max_time_step <- ave(time_step, run_num, FUN=max)
    # FLAG COLUMN
    max_time_no_eggs <- ifelse(time_step == max_time_step & no_eggs == 0, 1, 0) 
    # EXPAND FLAG TO ENTIRE run_num GROUP
    max_time_no_eggs <- ave(max_time_no_eggs, run_num, FUN=max)
})

sub_params <- transform(subset(params, max_time_no_eggs == 0),
                        max_time_step = NULL,
                        max_time_no_eggs = NULL)
0 голосов
/ 16 июня 2020

в начале R может быть немного сложно понять, вот как я бы сделал это в базе R

#your data
run_num <- c(1,1,1,1,1,1,49,49,49,49,49,49)
timestep <- c(0,1,2,3,4,5,13728,13729,13730,13731,13732,13733)
phys_length <- c(0.000000000,0.008209734,0.016332967,0.024238314,0.031594308,0.033077672,15.04109,15.04111,15.04112,15.04113,15.04114,15.04115)
eggs <- c(0,0,0,0,0,0,727,727,727,727,727,727)

params <- as.data.frame(cbind(run_num,timestep,phys_length,eggs))


#this line returns a vector of True and False we can use this to grab all the rows where the statement is true
params$eggs == 0 

#like here "params[,]" is your whole data frame, and in the "[,]" the first value is row number, and second is colunm number
#if set like below it returns all rows that were true, and since the second value was empty it returns all columns

no_eggs <- params[params$eggs == 0,]

Обновление: это даст вам номера запусков, которые производят яйца,

#find all runs with eggs
eggs <- params[params$eggs != 0,]

# grab run number and make it unique 
run <- unique(eggs[1])

#return all rows that result in runs with eggs greater than 0
cleaned_df <- params[eggs$run_num == run,]
...