【问题标题】:How to convert factor column in df to numeric strings per row?如何将df中的因子列转换为每行的数字字符串?
【发布时间】: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


【解决方案1】:

您可以将paste 用作:

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

【讨论】:

  • 这样好像把seqtext列的所有数据都变成了一个字符串。我需要将每个字符串放在自己的单元格中。
  • 那么你应该使用sapply
猜你喜欢
  • 1970-01-01
  • 2016-04-13
  • 1970-01-01
  • 1970-01-01
  • 2016-09-17
  • 2020-02-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多