Как использовать заявление if со списком в R

#r

Вопрос:

У меня есть список из двух пунктов. Я хотел бы установить условие, используя if оператор. Условие all также должно содержать утверждение.

Другими словами,

Предположим, у меня есть следующий список:

 library(VineCopula)
x <- BiCop(0,0)
y <- BiCop(0,0)
z <- list(x, y)
 

Я хотел бы иметь условие, в котором говорилось бы, что если все z[[i]]$tau меньше или больше определенного значения, то z оно должно быть равно нулю.

Вот мой код (пожалуйста, обратите внимание, что мой список может быть любой длины. То есть длина не фиксирована. Здесь я установил длину только для двух элементов, но мои реальные данные должны быть больше 2.):

      for (i in seq_len(m)){
  if (all( 0 <= z[[i]]$tau =< 0.15))
    z <- 0
}
 

Как это сделать в R?

Ответ №1:

Извлеките list элемент, оберните с all помощью логического условия , чтобы вернуть один TRUE/FALSE , используйте это в if , повторите цикл над » z » и присвоите tau элементам значение 0

 tau1 <- sapply(z, "[[", "tau") 
i1 <- all(tau1 >= 0 amp; tau1 <= 0.15)
if(i1) {
   z <- lapply(z, function(x) {x$tau <- 0; x})
}
 

Синтаксис 0 <= z[[i]]$tau =< 0.15 , по-видимому, математический, что не является правильным R синтаксисом, так как нам нужно объединить два выражения amp; . Кроме того, поскольку мы выполняем проверку all list элементов, нам, возможно, потребуется сделать это в два for цикла (если for используется цикл) — первый для проверки all соответствия условию и второй для выполнения задания (в случае, если первый вернул значение TRUE), т. е.

 i1 <- TRUE
# // first loop
for(i in seq_along(z)) {
     i1 <- i1 amp; z[[i]]$tau >= 0 amp; z[[i]]$tau <= 0.15
}
# // second loop
if(i1) {
   for(i in seq_along(z)) {
        z[[i]]$tau <- 0
     }
}
 

Комментарии:

1. Большое спасибо. Я действительно ценю это. Да, я использую for цикл.

2. @Maryam спасибо. Я обновил с for помощью цикла