如何将df中的因子列转换为每行数字字符串?

时间:2019-05-17 07:24:48

标签: r dataframe vector factors

我正在使用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字段,它将停止计算。

我知道应用sapply会更好,但是我不知道如何使它起作用。

1 个答案:

答案 0 :(得分:1)

您可以将paste用作:

as.numeric(unlist(strsplit(paste(df$seqtext, collapse = ","), ",")))