Соответствующие столбцы из фрейма данных на основе значения в столбце из другого фрейма данных

2

У меня есть два кадра данных. Первый - df1 имеет 485513 столбцов и 100 строк,

head(df1)

sample  cg1 cg2 cg3 cg4 cg5 cg6 cg7 cg8 cg9 cg10    cg11
AAD_1   33435   33436   33437   33438   33439   33440   33441   33442   33443   33444   33445
AAD_2   0.33    1.33    2.33    3.33    4.33    5.33    6.33    7.33    8.33    9.33    10.33
AAD_3   0.56    1.56    2.56    3.56    4.56    5.56    6.56    7.56    8.56    9.56    10.56
AAD_4   45.9    46.9    47.9    48.9    49.9    50.9    51.9    52.9    53.9    54.9    55.9
AAD_5   46.9    47.9    48.9    49.9    50.9    51.9    52.9    53.9    54.9    55.9    56.9
AAD_6   47.9    48.9    49.9    50.9    51.9    52.9    53.9    54.9    55.9    56.9    57.9
AAD_7   48.9    49.9    50.9    51.9    52.9    53.9    54.9    55.9    56.9    57.9    58.9
AAD_8   49.9    50.9    51.9    52.9    53.9    54.9    55.9    56.9    57.9    58.9    59.9
AAD_9   50.9    51.9    52.9    53.9    54.9    55.9    56.9    57.9    58.9    59.9    60.9
AAD_10  51.9    52.9    53.9    54.9    55.9    56.9    57.9    58.9    59.9    60.9    61.9

а второй имеет df2 84 строки и один столбец. Я пытаюсь получить подмножество df1, используя значения в столбце из фрейма данных df2.

head(df2)
    ID
    cg1
    cg2
    cg3
    cg4
    cg5

Значения df2 - это имена столбцов моего интереса от df1, поэтому я попробовал следующий однострочный в R.

> UP=(df1 %>% as.data.frame)[,df2$ID]

Кадр данных Up возвращает меня с несогласованными столбцами из моего запроса df2

И это привело к созданию фрейма данных UP с 84 столбцами и 100 строками, но ни один из столбцов приведенной выше командной строки не совпадает с фреймом данных ввода данных df2.

Было бы здорово, если бы кто-то предложил мне альтернативное решение

  • 2
    Почему в этом вопросе есть теги для панд и R? Какое решение вы ищете?
  • 0
    На самом деле R лучше
Теги:
pandas

2 ответа

1
Лучший ответ

В R мы можем просто сделать

df[as.character(df2$ID)]

предполагая, что столбец "ID" является factor. В случае, если это класс character, это проще

df[df2$ID]

Но если в "ID" есть элементы, которые не находятся в именах столбцов "df", лучше использовать intersect

df[intersect(colnames(df), df2$ID)]

Если "df" является data.table, обычным способом подмножества столбцов будет включение with =FALSE. Он упоминается в ?data.table

с

По умолчанию с = TRUE и j оценивается внутри фрейма x; имена столбцов могут использоваться как переменные.

Когда with = FALSE j является символьным вектором имен столбцов, числовым вектором позиций столбцов для выбора или формы startcol: endcol и возвращаемым значением всегда является таблица данных. with = FALSE часто полезно в data.table для динамического выбора столбцов. Обратите внимание, что x [, cols, with = FALSE] эквивалентно x [,.SD,.SDcols = cols].

Поэтому приведенные выше команды будут

 df[, as.character(df2$ID), with = FALSE]

или

 df[, df2$ID, with = FALSE] #if 'ID' is already character class.

Или

 df[, intersect(colnames(df), df2$ID), with = FALSE]
  • 0
    Вышеупомянутый R один вкладыш выбрасывает ошибку как; Когда i является data.table (или символьным вектором), x должен быть снабжен ключом (т. Е. Отсортирован и помечен как отсортированный), чтобы data.table знал, к каким столбцам присоединиться, и использовал бы преимущества сортировки x. Сначала вызовите setkey (x, ...), смотрите? Setkey.
  • 0
    @ user1017373 Я принял ваш набор данных как data.frame и из вашего ввода я не смог собрать, что это был data.table или data.frame. Если это data.table, df[, as.character(df2$ID), with = FALSE]
Показать ещё 6 комментариев
2

Предполагая, что df2 является серией:

>>> df[df2.tolist()]

        cg1       cg2       cg3       cg4       cg5
0  33435.00  33436.00  33437.00  33438.00  33439.00
1      0.33      1.33      2.33      3.33      4.33
2      0.56      1.56      2.56      3.56      4.56
3     45.90     46.90     47.90     48.90     49.90
4     46.90     47.90     48.90     49.90     50.90
5     47.90     48.90     49.90     50.90     51.90
6     48.90     49.90     50.90     51.90     52.90
7     49.90     50.90     51.90     52.90     53.90
8     50.90     51.90     52.90     53.90     54.90
9     51.90     52.90     53.90     54.90     55.90

Если это кадр данных, то это должно работать:

df[df2.ID.tolist()]
  • 0
    ОП, потому что R решение?
  • 0
    независимо от языковой путаницы, это полезный ответ. @ Александр как насчет df2.squeeze().tolist() ?
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню