Разделение фрейма данных на основе значений столбца - PullRequest
0 голосов
/ 27 июня 2018

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

    a=c("Model_A","R1",358723.0,171704.0,1.0,36.818500,4.0222700,1.38895000)
    b=c("Model_A","R2",358723.0,171704.0,2.6,36.447300,4.0116100,1.37479000)
    c=c("Model_A","R3",358723.0,171704.0,5.0,35.615400,3.8092600,1.34301000)
    d=c("Model_B","R1",358723.0,171704.0,1.0,39.818300,2.4475600,1.50384000)
    e=c("Model_B","R2",358723.0,171704.0,2.6,39.391600,2.4209900,1.48754000)
    f=c("Model_B","R3",358723.0,171704.0,5.0,38.442700,2.3618400,1.45126000)
    g=c("Model_C","R1",358723.0,171704.0,1.0,31.246400,2.2388000,1.30652000)
    h=c("Model_C","R2",358723.0,171704.0,2.6,30.911600,2.2144800,1.29234000)
    i=c("Model_C","R3",358723.0,171704.0,5.0,30.166700,2.1603000,1.26077000)
    df=data.frame(a,b,c,d,e,f,g,h,i)
    df=t(df)
    df=data.frame(df)
    col_list=list("Model","Receptor.name","X(m.)","Y(m.)","Z(m.)",
    "nox","PM10","PM2.5")
    colnames(df)=col_list

По сути, я пытаюсь разделить фрейм данных (df) по именам моделей («Model_A», «Model_B» и «Model_C») и сохранить их в новых и разных фреймах данных. Я пытался использовать следующую команду

    df_test=split(df,with(df,interaction(Model,Model)), drop = TRUE)

Эта команда разделяет фрейм данных, но сохраняет их в списках, и я не знаю, как извлечь списки по отдельности и сохранить их как фреймы данных. Есть ли более простое решение (если возможно, избегать команды подмножеств, поскольку мне нужно, чтобы скрипт был динамичным и относительным), или кто-нибудь знает, как использовать последнюю команду, показанную выше, для разделения списков на отдельные фреймы данных? Также, если возможно, можно ли назвать фрейм данных после модели?

Я прошу прощения, если это много вопросов, но любая помощь будет принята с благодарностью! Спасибо!

1 Ответ

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

list2env(split(df, df$Model), envir = .GlobalEnv) предоставит вам три кадра данных в вашей глобальной среде, названных в честь моделей, содержащих соответствующие строки.

> Model_A
    Model Receptor.name  X(m.)  Y(m.) Z(m.)     nox    PM10   PM2.5
a Model_A            R1 358723 171704     1 36.8185 4.02227 1.38895
b Model_A            R2 358723 171704   2.6 36.4473 4.01161 1.37479
c Model_A            R3 358723 171704     5 35.6154 3.80926 1.34301

Хотя я бы просто сохранил список из трех фреймов данных, используя только dflist <- split(df, df$Model).


Почему список? Списки позволяют использовать lapply - циклическую функцию, которая применяет операцию ко всем элементам списка. Быстрый пример: допустим, вы хотите получить таблицу частот для обеих PM переменных в ваших данных для всех трех наборов данных.

Для отдельных элементов в вашей глобальной среде это будет

table(Model_A$PM10)
table(Model_A$PM2.5)
...
table(Model_C$PM2.5)

Со списком это будет

lapply(dflist, function(x) table(x["PM10"]))
lapply(dflist, function(x) table(x["PM2.5"]))

Сейчас кажется, что он сохраняет только некоторые строки кода, но, что еще лучше, вывод lapply снова представляет собой list, который вы можете сохранить в объекте и в дальнейшем использовать для различных операций. Благодаря этому вы можете создать глобальную среду, содержащую всего несколько объектов, каждый из которых представляет собой списки, содержащие определенные похожие объекты, такие как кадры данных, таблицы, сводные данные или даже графики.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...