Как преобразовать фактор столбца в df в числовые строки в строке? - PullRequest
1 голос
/ 17 мая 2019

Я использую 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.

Я понимаю, что Саппли будет лучшеэ, но я не понимаю, как заставить это работать.

1 Ответ

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

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

as.numeric(unlist(strsplit(paste(df$seqtext, collapse = ","), ",")))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...