У меня есть данные xy для экспрессии генов в нескольких образцах. Я хочу разделить первый столбец, чтобы упорядочить гены в алфавитном порядке и выполнить некоторую другую фильтрацию.
> setwd("C:/Users/Will/Desktop/BIOL3063/R code assignment");
> df = read.csv('R-assignments-dataset.csv', stringsAsFactors = FALSE);
Первый столбец представляет собой список названий генов (A2M, AAAS, AACS и т. д.), и каждый столбец представляет собой отдельный образец ткани, таким образом показывая экспрессию гена в каждом образце ткани.
Задается вопрос: «Отсортируйте имена генов в алфавитном порядке (A-Z) и распечатайте первые 20 имен генов».
Мой мыслительный процесс состоял бы в том, чтобы выделить подмножество первого столбца (имена генов), а затем выполнить order()
для сортировки по алфавиту, после чего я могу использовать head()
для печати первых 20.
Однако, когда я пытаюсь
> genes <- df[1]
Он просто подмножает первый столбец, содержащий данные (TCGA-A6-2672_TissueA), а не столбец слева.
Также
> genes <- df[,df$col1];
> genes;
data frame with 0 columns and 7065 rows
> order(genes);
integer(0)
Появляется, чтобы создать список имен генов в средстве просмотра R studio, но я не могу выполнить с ним какие-либо манипуляции.
Я не могу правильно найти первый столбец в data.frame, так как у него нет заголовка столбца, и у меня также есть такая же проблема, когда я делаю то же самое со строкой 1 (примеры имен).
Я полный новичок в R, и это часть задания, над которым я работаю, кажется, мне не хватает чего-то фундаментального, но я не могу понять, что.
Ура ребята
Если вы спрашиваете то, что, как я думаю, вы спрашиваете, вам просто нужно подмножество внутри функции as.data.frame
, которая автоматически сгенерирует «заголовок», как вы это называете. Она будет называться V1
, первая переменная вашего нового фрейма данных.
genes <- as.data.frame(df[,1])
genes$V1
1 A
2 C
3 A
4 B
5 C
6 D
7 A
8 B
Согласно приведенному ниже комментарию, проблемы можно избежать, если вы удалите запятую из синтаксиса подмножества. Когда вы выбираете столбцы из data.frame
, вам нужно индексировать только столбец, а не строки.
genes <- df[1]
Разница заключается в синтаксисе подмножества оригинального плаката. Если вы подмножествуете с помощью df[,1]
, вы возвращаете вектор (векторизованную версию первого столбца df
). Если вы позвоните df[1]
, вы избежите этой проблемы. Я просто отвечаю на вопросы, как они были заданы.
Проблема, с которой я сталкиваюсь, заключается в том, что обе эти строки кода genes <- as.data.frame(df[,1])
и genes <- df[1]
подмножают столбец справа от столбца, который я собираюсь подмножить. Я намерен подмножить имена генов в первом столбце, а не числовые значения во втором столбце. Я отредактировал свой исходный пост для ясности, спасибо.
Ах я вижу. Я изначально неправильно понял ваш вопрос. Вы хотите извлечь имена строк, используя функцию rownames
Пожалуйста, включите образец вашего текстового файла в виде текста, а не изображения.
Я создал набор данных, похожий на ваш:
X Y
1 a b
2 c d
3 d g
Обратите внимание, что столбцы тканей имеют заголовок, а названия генов — нет. Поэтому они будут интерпретироваться как имена строк, см. ?read.table
:
If row.names is not specified and the header line has one less entry than the number of columns, the first column is taken to be the row names.
Читаю в R:
df <- read.table(text = ' X Y
1 a b
2 c d
3 d g')
Таким образом, ваши имена генов находятся не в df[1]
, а в rownames(df)
, поэтому, чтобы получить эти genes <- rownames(df)
или добавить их в существующую df, вы можете использовать df$gene <- rownames(df)
Существует множество способов преобразовать имена ваших строк в столбцы, см., например, этот вопрос.
Спасибо! Проблема заключалась в том, что я не мог найти имена своих генов, поэтому использование genes <- rownames(df)
дало результаты, которые я искал.
Рад, что смог помочь, теперь вам нужно взглянуть на ?order
, вот так: sorted.genes <- genes[order(genes)]
и попасть в топ-20: top.20 <- head(sorted.genes, 20)
@WillFinch
Так какой именно желаемый результат здесь? Вы пытаетесь извлечь значения, начинающиеся с «A2M|2»? Если у первого столбца нет заголовка, R будет считывать его как имена строк. Попробуйте посмотреть на
rownames(df)
.