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
13309
уездный город Н
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
13309
уездный город Н
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, Супермодераторы



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

Сейчас этот форум просматривают: нет зарегистрированных пользователей


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

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