Я использую R для исследовательского проекта, который требует, чтобы я ввел последовательность из 1-5 разной длины, а затем вычислил оценку по этой последовательности.
Фрейм данных, который у меня есть, хранит последовательности как фактор.Если я возьму одну запись и преобразую ее в числовой вектор, я могу ввести ее в формулу.Но если я пытаюсь сделать это для всех строк, я сталкиваюсь с ошибками.
Я искал SO и другие источники, но нашел информацию только о том, как преобразовать коэффициенты в числовые, если они содержат одно значение на ячейку.Мои данные содержат последовательность чисел на ячейку, разделенных запятыми.Если я беру данные из одной ячейки и использую as.numeric (strsplit (as.character), это работает. Но я не хочу делать все ячейки вручную. Как я могу решить эту проблему?
Это то, что я сделал:
df <- read.csv2("example_seq_logs.csv", na.strings = "n/a")
df$seqtext <- as.character(df$hmm)
Вот как выглядит фрейм данных:
head(df)
lesson hmm
1 A 1,2,3,3,3,4,3,4,5,4,4,5,5,2,2,1,2,3,4,2,3
2 B 2,2,3,4,1,1,3,3,3,5,5,4,4,4,2,1
3 C 1,3,1,3,2,3,2,2,3,3,4,1,3,2,3,3,5,4,4,3,3
4 D 1,3,2,2,3,3,2,3,1,4,4,5,5,2,4,4,4,3
5 E 1,4,2,5,1,3,1,3,1,4,3,4,4
str(df)
'data.frame': 5 obs. of 2 variables:
$ lesson: Factor w/ 5 levels "A","B","C","D",..: 1 2 3 4 5
$ hmm : Factor w/ 5 levels "1,2,3,3,3,4,3,4,5,4,4,5,5,2,2,1,2,3,4,2,3",..: 1 5 2 3 4
sapply(df, mode)
lesson hmm
"numeric" "numeric"
Теперь, если я беру одну запись, я могу сделать это:
testseq <- as.numeric(strsplit(df$seqtext)[1],",")[[1]])
str(testseq)
num [1:21] 1 2 3 3 3 4 3 4 5 4 ...
изатем я могу ввести последовательность testseq в нужную мне функцию, но когда я пытаюсь сделать то же самое для всего столбца, это приводит к ошибке
df$seq <- as.numeric(strsplit(df$seqtext, ","))[[1:58]]
Error: (list) object cannot be coerced to type 'double'
Спасибо за вашу помощь!
Редактировать: Первое предложение приводит к этой ошибке:
df$seq <- as.numeric(unlist(strsplit(paste(df$seqtext, collapse = ","), ",")))
Error in `$<-.data.frame`(`*tmp*`, seq, value = c(1, 2, 3, 3, 3, 4, 3, :
replacement has 89 rows, data has 5
Кажется, он превращает весь столбец в одну длинную строку.
a <- as.numeric(unlist(strsplit(paste(df$seqtext, collapse = ","), ",")))
print(a)
[1] 1 2 3 3 3 4 3 4 5 4 4 5 5 2 2 1 2 3 4 2 3 2 2 3 4 1 1 3 3 3 5 5 4 4 4 2 1 1 3 1 3 2 3 2 2 3 3 4 1 3 2 3
[53] 3 5 4 4 3 3 1 3 2 2 3 3 2 3 1 4 4 5 5 2 4 4 4 3 1 4 2 5 1 3 1 3 1 4 3 4 4
Но мне нужно, чтобы каждая последовательность появлялась в правом рядув виде строки.
Редактировать: я обнаружил, что функция, с которой мне нужно вычислять результаты, не нуждается в цифрах, поэтому теперь я решил проблему с помощью цикла for:
df$score <- 0
for (i in 1:nrow(df)) {
seq <- as.array(strsplit(as.character(df$hmm),","))
session_seq <- seq[i]
res = computehmm(session_seq)
df$score[i] <- res$score
}
Но теперь он перестает вычислять, как только достигает пустого поля df $ hmm.
Я понимаю, что Саппли будет лучшеэ, но я не понимаю, как заставить это работать.