Как сделать определенную часть строки столбцом и изменить его имя для нескольких строк? - PullRequest
0 голосов
/ 27 июня 2019

Я преобразовал массив во фрейм данных и добавил имена столбцов.Ниже показан пример фрейма данных.Я хотел бы, чтобы "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 голосов
/ 27 июня 2019

@ Комментарий RAB - это аккуратный и эффективный способ получить большинство решений, но я думаю, что необходимо выполнить два дополнительных шага, так что вот альтернатива:

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

Первая строка создает фрейм данных и выполняет замену регулярных выражений для имен, чтобы избавиться от «Class:» и любого конечного числа. Я выбрал sub вместо gsub, поскольку в вашем примере предполагается, что в каждой строке есть только одна подстановка, но здесь они должны работать одинаково.

Затем вторая строка заменяет имя вашего нового столбца на желаемую метку «Класс». Обратите внимание, что первые две строки можно объединить так: results <- cbind(data.frame(Class = sub(".*?: (.*?)\\d*$", "\\1", rownames(results))), results), это просто вопрос стиля / читаемости.

Последняя строка избавляется от исходных имен строк, заменяя их пустым вектором. Это очистит выходные данные, если вы напечатаете кадр данных, но не окажет никакого влияния на дальнейший анализ.

0 голосов
/ 27 июня 2019

Это работает:

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])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...