如何将某行的某一部分设为一列并更改其名称以用于多行?

时间:2019-06-26 23:11:30

标签: r

我将数组转换为数据框,并添加了列名。下面显示了数据框的示例。我想将“ Class:Negative”放在一列而不是一行中,然后将“ Class:Negative1”更改为“ Negative”,将“ Class:Neutral1”更改为“ Neutral”,依此类推。

我试图汇总数据,而无需进行这些更改,这将使此操作变得困难,那么我该怎么做才能完成上面R中概述的这些更改? (不确定如何执行此操作)

results <- do.call(rbind.data.frame,result2)
colnames(results) = c("Sensitivity", "Specificity")
results

当前输出:

                  Sensitivity Specificity
Class: Negative    0.86051081   0.8934176
Class: Neutral     0.51345486   0.8739516
Class: Positive    0.79404812   0.8982959
Class: Negative1   0.64734774   0.9644023
Class: Neutral1    0.78298611   0.6420487
Class: Positive1   0.59282436   0.9338653

我想通过输出来实现:

   Class       Sensitivity Specificity
   Negative    0.86051081   0.8934176
   Neutral     0.51345486   0.8739516
   Positive    0.79404812   0.8982959
   Negative    0.64734774   0.9644023
   Neutral     0.78298611   0.6420487
   Positive    0.59282436   0.9338653

2 个答案:

答案 0 :(得分:0)

这有效:

Class=as.character(results[,1])
F=strsplit(Class, ":") #separator indicated by colon
Class=sapply(F, `[[`, 2)

Class=sub("Neutral1", "Neutral", x=Class)
Class=sub("Negative1", "Negative", x=Class)
Class=sub("Positive1", "Positive", x=Class)

如果您的数据递增,或者仅用于更简洁的代码,则可以使用:

Class2=unlist(lapply(strsplit(ClassF, ":"), `[[`, 2), use.names = FALSE)
Class=gsub("*[1-9]", "", Class2)

无论您在上面选择什么,然后放到一个数据框中

df2=cbind(Class, Sensitivity=results[,2], Specificity=results[,3])

答案 1 :(得分:0)

@RAB的评论是获得大多数解决方案的一种简洁有效的方法,但是我认为还需要两个额外的步骤,所以这里有一个替代方法:

results <- cbind(sub(".*?: (.*?)\\d*$", "\\1", rownames(results)), results)
names(df)[1] <- "Class"
rownames(results) <- c()

第一行创建数据帧,并对名称进行正则表达式替换,以摆脱“ Class:”和任何尾随数字。我选择了sub而不是gsub,因为您的示例建议每行只有一个替换,但是这两个在这里应该表现相同。

然后,第二行用所需的标签“ Class”替换新列的名称。请注意,前两行可以这样组合:results <- cbind(data.frame(Class = sub(".*?: (.*?)\\d*$", "\\1", rownames(results))), results),这只是样式/可读性的问题。

最后一行通过用空向量替换原始行名来摆脱它们。如果您打印数据框,这样做将清除输出,但不会影响任何进一步的分析。

相关问题