Несколько комментариев о вашей попытке:
- (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