【发布时间】:2019-05-17 07:24:48
【问题描述】:
我正在将 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 ...
然后我可以将 testeq 序列输入到我需要的函数中。 但是当我对整个列尝试相同时,它会导致错误
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 会更好,但我不明白如何让它工作。
【问题讨论】:
-
如果您以可重现的形式分享您的数据并更清楚预期的输出,这将对那些提供帮助的人有所帮助。
-
你的意思是把 csv 上传到某个地方吗?我假设显示数据框会很清楚。预期的输出将是使用 computehmm 函数从序列计算的每一行的分数,插入到数据框中。如果有帮助,我可以添加 computehmm 函数的代码,但我认为问题不存在,而且代码很多。感谢您的意见。
标签: r dataframe vector factors