Как назвать элемент списка на основе его значений, используя оператор if в R - PullRequest
0 голосов
/ 05 мая 2019

Коротко о моей проблеме

Предположим, у меня есть список из двух векторов, каждый из которых содержит элемент 6.

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

Пример:

 x <- c(1,3,5,22,78,56)
 y <- c(2,4,3,21,88,77)
 z <- list(x, y)

Затем я хотел бы сравнить значения x и y следующим образом:

Сравнить первый элемент x с первым из y.Если значение x больше, чем y, то первый элемент должен иметь имя A, в противном случае он должен именоваться B.Затем на выходе должно быть 6 элементов следующим образом:

B B A A B B

Вот моя попытка:

for(i in 1:6){
  if(z[[1]][i] > z[[2]][i])
    z[[1]][[i]] <- "M"
  else "B"
}

, но верните мне список.

Ответы [ 2 ]

1 голос
/ 05 мая 2019

«Лучшие» решения в R часто используют векторы, а не циклы.В предыдущих примерах используются векторы.Вот еще одно такое решение:

ifelse(z[[1]] > z[[2]], "A", "B")

Если вы воспользуетесь преимуществами именования элементов в списке, этот пример может сделать код более удобным для пользователя.В этом примере имена в списке выбираются так, чтобы они были идентичны именам переменных.Это может быть любое синтаксически допустимое имя.И кавычки не нужны вокруг имен в функции list().

  z <- list(x = x, y = y)
  ifelse(z$x > z$y, "A", "B")
0 голосов
/ 05 мая 2019

Я не уверен, есть ли у вас конкретная причина, по которой вы хотите использовать оператор 'if' и список, но если вы просто ищете результат в столбце, это работает:

library(dplyr)

df <- tibble(
x = c(1,3,5,22,78,56),
y = c(2,4,3,21,88,77)
) %>% 
  mutate(result = case_when(
    x > y ~ "A",
    TRUE ~ "B"
  ))

case_when часто является хорошей заменой оператора if и работает быстрее.

Если вы действительно хотите получить результат в списке, вы можете сделать это в конце:

df_list <- list(df$x, df$y, df$result), но в этом случае приведенный выше комментарий, вероятно, предлагает более прямое решение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...