Как построить функцию с фактором и вектором - PullRequest
0 голосов
/ 28 января 2019

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

Прямо сейчас это то, что у меня есть, но возвращает только список на NA:

mk_factor_list <- function(x,f) {

 {
   {if (length(x) == length(f) ) 
   {print(":)")}
     else { stop(print("f and x don't have the same length"))}
  listf <- rep (NA, length(levels(f)))  
    for (i in levels (f)) 
  listf[i] <-x[i] 


 }}
  return (listf)
}

1 Ответ

0 голосов
/ 28 января 2019

Несколько комментариев о вашей попытке:

  • (a) ваш print(':)') может пригодиться для отладки, но если вы собираетесь оставить его в функции, когда закончите, используйте message не print, поэтому пользователи могут отключить его, если хотят.
  • (b) Вам не нужно print() внутри stop().Просто используйте stop("f and x ...").
  • (c) listf - это вектор, а не list, когда вы определяете его как listf <- rep (NA, length(levels(f))).Сделайте его list, используя вместо него listf = list().
  • (d) Скажем, у вашего фактора есть уровни 'a' и 'b '.Когда вы делаете for (i in levels (f)), это означает, что i сначала будет 'a', а затем 'b'.TSo, когда вы присваиваете listf[i] <- x[i] то, что видит R listf['a'] <- x['a'].listf['a'] плохо только потому, что вы должны использовать двойные скобки для одного элемента списка: listf[['a']] <- ... необходимо.x['a'] не имеет никакого смысла.Вы хотите, чтобы элементы x соответствовали , которые элементов f равны 'a', поэтому используйте x[which(f == i)].

Соединяя их вместе, вы сможетеполучить рабочий ответ.Но если вы хотите увидеть действительно профессиональный способ сделать это, введите split.default в вашу консоль и посмотрите версию ядра R.


Основываясь на вашем комментарии, вот рабочая версия.Большую часть того, что я сделал, чтобы получить из вашего комментария, было удаление строк (почему все лишние { в начале?) И замена на код из моих пуль выше.

mk_factor_list <- function(x, f) {
  if (length(x) != length(f)) {
    stop("f and x don't have the same length")
  }
  listf = list()
  for (i in levels (f)) {
    listf[[i]] <- x[which(f == i)]
  }
  return(listf)
}

mk_factor_list(x = 1:5, f = factor(c('a', 'b', 'a', 'b', 'c'))
# $a
# [1] 1 3
# 
# $b
# [1] 2 4
# 
# $c
# [1] 5
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...