我正在使用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会更好,但是我不知道如何使它起作用。
答案 0 :(得分:1)
您可以将paste
用作:
as.numeric(unlist(strsplit(paste(df$seqtext, collapse = ","), ",")))