2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




Начать новую тему Ответить на тему
 
 Выборка из таблицы в R
Сообщение07.08.2018, 07:29 
Заслуженный участник
Аватара пользователя


11/12/05
9957
Есть таблица с данными, например:
$$
\begin{tabular}{l*{8}{c}r}
Value |     & s_1 & s_2 & s_3 & s_4 & s_5  & s_6 & s_7 &...& s_{150} \\
\hline
par_1 |& 3 & 4 & 0 & 2 & 10 & 5 & 12 &...&  4 \\
par_2 | & 7 & 3 & 0 & 3 &  8 & 9 &  9 &...&  6\\
par_3 | & 4 & 2 & 1 & 3 &  7 & 8 &  7 &...& 1 \\
par_4 | & 10 & 2 & 1 & 3 &  5 & 8 &  7 &...& 15 \\
......\\
par_{1000} | & 2 & 3& 7 & 8& 12& 0 &3 & ... & 11\\
\end{tabular}
$$
где $s_1 ... s_{150}$ - образцы, а $par_i, \ i=1,...,1000$ - значения неких параметров этих образцов. Также есть столбец $S$, в котором указана принадлежность образцов к группам:

$
S = (A \ A\ B\ A\ C\ B\ C\ G \ ...\  G)^T
$

то есть образцы $s_1, \ s_2, \ s_4$ принадлежат группе $A$. Для обработки данных мне надо уметь выделять образцы из этой таблицы в подтаблицы: например, выбрать именно те образцы, которые HE входят в группу $B$. Или те, что входят в $C$ и $G$.

Мне это умение необходимо потому, что разбиение на группы будет меняться много раз, как и само количество групп. Tаблица содержит более сотни образцов, так что вручную это делать непродуктивно.

Собственные попытки:

Нашел команду subset, но инструкции к ней не подразумевают такой хитровывернутости, которую я ищу.

 Профиль  
                  
 
 Re: Выборка из таблицы в R
Сообщение07.08.2018, 08:09 
Заслуженный участник
Аватара пользователя


08/11/11
5940
Никогда не пользовался на R, но ради интереса попробовал поискать ответ. Заранее извиняюсь, если я что-то нашёл неправильно, проверять лень.

Dan B-Yallay в сообщении #1330983 писал(а):
Нашел команду subset, но инструкции к ней не подразумевают такой хитровывернутости, которую я ищу.


Да, этой функцией, похоже, строки можно удалять по логическому условию, а столбцы -- только если руками ввести какие именно. Возможно, потому что обычно столбцы -- это параметры, а строки -- образцы. Может быть, транспонировать таблицу?

Другой вариант -- функция select

https://www.rstudio.com/wp-content/uplo ... tsheet.pdf (на первой странице справа внизу)
https://www.rdocumentation.org/packages ... ics/select

Она умеет выбирать столбцы по названию (например, если в названии встречается подстрока). Т. е., хотя это и через одно место, можно к названию $s_i$ временно приписывать соответствующую букву, а потом фильтровать по наличию этой буквы; или комбинировать несколько таких условий или их отрицаний с помощью логических операций.

 Профиль  
                  
 
 Re: Выборка из таблицы в R
Сообщение07.08.2018, 09:28 
Аватара пользователя


11/12/16
13311
уездный город Н
g______d в сообщении #1330986 писал(а):
Возможно, потому что обычно столбцы -- это параметры, а строки -- образцы. Может быть, транспонировать таблицу?


+1
Элемент в таблице в подавляющем большинстве случаев - это строка, а не столбец.
Аналогично в SQL:
1. Data Manipulation Language, DML, то есть SELECT, INSERT, UPDATE, DELETE, работает исключительно со строками.
2. А добавление\удаление столбцов - это уже Data Definition Language, DDL.

Dan B-Yallay в сообщении #1330983 писал(а):
Также есть столбец $S$, в котором указана принадлежность образцов к группам:

$S = (A \ A\ B\ A\ C\ B\ C\ G \ ...\  G)^T$

то есть образцы $s_1, \ s_2, \ s_4$ принадлежат группе $A$.

В Вашем варианте таблице это строка.

 Профиль  
                  
 
 Re: Выборка из таблицы в R
Сообщение07.08.2018, 16:54 
Заслуженный участник
Аватара пользователя


11/12/05
9957
g______d
Спасибо за идею и ссылки, буду смотреть.

EUgeneUS
Я практически не знаком с SQL, но мне кажется, они с R мало пересекаются.
EUgeneUS в сообщении #1330991 писал(а):
В Вашем варианте таблице это строка.
Возможно, надо посмотреть размерность.

 Профиль  
                  
 
 Re: Выборка из таблицы в R
Сообщение07.08.2018, 19:34 
Аватара пользователя


11/12/16
13311
уездный город Н
Dan B-Yallay в сообщении #1331055 писал(а):
Я практически не знаком с SQL, но мне кажется, они с R мало пересекаются.


У меня обратная ситуация - с R знаком чуть менее, чем никак. SQL был приведен для иллюстрации простой мысли:
1. Набор столбцов - это описание данных.
2. Набор строк - это собственно данные.

Соответственно, и команды для работы со строками и со столбцами различаются существенно.

 Профиль  
                  
 
 Re: Выборка из таблицы в R
Сообщение07.08.2018, 22:47 


09/05/16
138
Dan B-Yallay в сообщении #1330983 писал(а):
Также есть столбец $S$, в котором указана принадлежность образцов к группам


S - отдельная переменная? Это не принципиально, но в примерах кода я предположу, что да. Дополнительно предположу, что S - вектор (если нет, придётся добавить один индекс, равный единице).

Dan B-Yallay в сообщении #1330983 писал(а):
Для обработки данных мне надо уметь выделять образцы из этой таблицы в подтаблицы: например, выбрать именно те образцы, которые HE входят в группу $B$. Или те, что входят в $C$ и $G$.


Если я правильно понял задачу, достаточно использовать Булевы индексы:

Код:
mytable <- matrix(
    ncol=8, byrow=T,
    dimnames=list(
        c("par1","par2","par3","par4","par1000"),
        c("s1","s2","s3","s4","s5","s6","s7","s150")
    ),
    data=c(
        3, 4, 0, 2, 10, 5, 12, 4,
        7, 3, 0, 3, 8, 9, 9, 6,
        4, 2, 1, 3, 7, 8, 7, 1,
        10, 2, 1, 3, 5, 8, 7, 15,
        2, 3, 7, 8, 12, 0, 3, 11
    )
)
S <- factor(c("A", "A", "B", "A", "C", "B", "C", "G"))
stopifnot(length(S) == ncol(mytable))
mytable[,S=="C" | S=="G"]
#         s5 s7 s150
# par1    10 12    4
# par2     8  9    6
# par3     7  7    1
# par4     5  7   15
# par1000 12  3   11


Выбрать из таблицы mytable все строки (до запятой ничего не стоит) и те столбцы, для которых в векторе $ \{ S_i = C \lor S_i = G \quad \forall i \} $ находится $\mathrm{TRUE}$.

Замечу, что класс data.frame, используемый в R для многих задач, предполагает, что образцы располагаются по строкам, а параметры - по столбцам. Отличие датафреймов от матриц в том, что разные колонки могут иметь разные типы:

Код:
myframe <- cbind(as.data.frame(t(mytable)), S)
str(myframe)
# 'data.frame':   8 obs. of  6 variables:
#  $ par1   : num  3 4 0 2 10 5 12 4
#  $ par2   : num  7 3 0 3 8 9 9 6
#  $ par3   : num  4 2 1 3 7 8 7 1
#  $ par4   : num  10 2 1 3 5 8 7 15
#  $ par1000: num  2 3 7 8 12 0 3 11
#  $ S      : Factor w/ 4 levels "A","B","C","G": 1 1 2 1 3 2 3 4
myframe[myframe$S != "B",]
#      par1 par2 par3 par4 par1000 S
# s1      3    7    4   10       2 A
# s2      4    3    2    2       3 A
# s4      2    3    3    3       8 A
# s5     10    8    7    5      12 C
# s7     12    9    7    7       3 C
# s150    4    6    1   15      11 G

 Профиль  
                  
 
 Re: Выборка из таблицы в R
Сообщение08.08.2018, 00:04 
Заслуженный участник
Аватара пользователя


11/12/05
9957
aitap
Спасибо за код, я попробую.

 Профиль  
                  
 
 Re: Выборка из таблицы в R
Сообщение08.08.2018, 11:17 
Заслуженный участник
Аватара пользователя


18/01/13
12044
Казань
aitap
Второй пример я поняла, я и сама бы так написала. А зачем в первом примере команда stopifnot(length(S) == ncol(mytable))? Что она делает?

 Профиль  
                  
 
 Re: Выборка из таблицы в R
Сообщение08.08.2018, 11:36 


09/05/16
138
provincialka, я хотел подчеркнуть, что каждый элемент вектора S соответствует отдельной колонке матрицы с остальными данными. Если бы я ошибся с числом колонок или элементов в векторе S, программа бы упала на этой строке.

Без этой проверки попытка применить к матрице Булев индекс меньшего размера, чем число колонок в ней, молча повторяет индекс, пока он не дорастёт до нужного размера. Такую ошибку может быть трудно отследить. (К счастью, слишком длинный Булев индекс всё-таки приводит к падению на месте.)

 Профиль  
                  
 
 Re: Выборка из таблицы в R
Сообщение08.08.2018, 15:58 
Заслуженный участник
Аватара пользователя


18/01/13
12044
Казань
aitap
А! Понятно. Точно, R приводит строки меньшей длины к большей.

 Профиль  
                  
 
 Re: Выборка из таблицы в R
Сообщение08.08.2018, 22:49 
Заслуженный участник
Аватара пользователя


11/12/05
9957
aitap в сообщении #1331104 писал(а):
mytable[,S=="C" | S=="G"]

Эта выборка работает замечательно, так же как и
Код:
mytable[, S != "A"]
Cпасибо.

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 11 ] 

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: gris


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group