Создание нового списка из старого списка (R) - PullRequest
0 голосов
/ 25 сентября 2019

Как пользователь Python, R до сих пор был несколько интуитивно понятен.Однако я сталкиваюсь с проблемой создания нового списка из старого.

В частности, у меня есть список:

> x
[[1]]
  [1] "Heads" "Tails" "Tails" "Heads" "Tails" "Heads"
  [7] "Tails" "Tails" "Tails" "Heads" "Heads" "Tails"
  ... .... ... etc.

Это длина 100. Я хотел быпереберите этот список и создайте список y со значениями «Heads» = 1, «Tails» = -1.Моя попытка до сих пор:

> for (val in x) {
         ifelse(val == 'Heads', c(y,1), c(y,-1))}

, которая добавляет пустой список y.Однако в результате получается список длины 2. Кто-нибудь может мне помочь?

Ответы [ 2 ]

1 голос
/ 25 сентября 2019

Вы можете использовать именованный вектор:

c("Heads" = 1, "Tails" = -1)[x[[1]]]
> Heads Tails Tails Heads Tails Heads Tails Tails Tails Heads Heads Tails 
      1    -1    -1     1    -1     1    -1    -1    -1     1     1    -1 

Или получить вектор, используя логическое преобразование в числовое (элегантно, но, возможно, не самый эффективный):

(x[[1]] == "Heads") * 2 - 1
> [1]  1 -1 -1  1 -1  1 -1 -1 -1  1  1 -1
0 голосов
/ 25 сентября 2019

Насколько я понимаю, у вас есть вложенный список с двумя уникальными значениями.Вы можете использовать lapply для этого:

x <- list(list("Heads","Tails","Heads"),list("Heads","Tails","Tails"))
lapply(x, function(x){y <- ifelse(x == "Heads", 1, -1); names(y) <- x; y})

# [[1]]
# Heads Tails Heads 
# 1    -1     1 
# 
# [[2]]
# Heads Tails Tails 
# 1    -1    -1

или, если вам не нужны имена, используйте rapply:

x <- list(list("Heads","Tails","Heads"),list("Heads","Tails","Tails"))
rapply(x, function(x){ifelse(x == "Heads", 1, -1)})
...