Доступ к данным в R с использованием нескольких идентификаторов столбцов

Мне очень трудно найти простой способ доступа к данным на основе нескольких столбцов, идентифицирующих эти данные.

Например, у меня есть данные за несколько лет, несколько графиков и несколько выборок на этих графиках и параметр в конце (x, y). Итак, мои заголовки данных выглядят так:

Год, участок, идентификатор образца

У меня есть много уровней в каждом из них, и я хочу иметь возможность быстро и легко отобразить эти значения, например, в год =2015, участок =3 и идентификатор образца = C.

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

plot( x[Year=="2015" & Plot=="3" & Sample ID=="C"], 
      y[Year=="2015" & Plot=="3" & Sample ID=="C"]
)

1 ответ

Решение

Итак, допустим, ваши данные выглядят так:

base_data = expand.grid(Year = 2013:2015,
                        Plot = 1:3,
                        SampleID = LETTERS[1:3],
                        ObsID = 1:4)
n = nrow(base_data)
base_data$x = runif(n)
base_data$y = rnorm(n)
head(base_data)
#   Year Plot SampleID ObsID         x           y
# 1 2013    1        A     1 0.5504904  0.64624816
# 2 2014    1        A     1 0.5337804  0.08473398
# 3 2015    1        A     1 0.9584508  0.31683347
# 4 2013    2        A     1 0.0854122  0.61898020
# 5 2014    2        A     1 0.8061409 -0.46255868
# 6 2015    2        A     1 0.8764612  0.24384120

В следующий раз, когда вы задаете вопрос, вы должны включить код для создания данных или поделиться своими данными с dput(), Тогда нет никакой догадки о том, как выглядят ваши данные, каковы классы и т. Д.

В любом случае, построить график зависимости y от x для каждого года, графика и SampleID. Мне нравится использовать dplyr за это:

library(dplyr)
# first we group our data
group_by(base_data, Year, Plot, SampleID) %>%
    # then we "do" a function that saves a plot
    # within this function, `.` is an abbreviation for
    # the piece of the data frame that is one group
    do({
       # create a filename. Within a group, there is only
       #     one value each for year, plot, and sample ID
       #     so I'll just use the first row in the filename
       group_name = paste0("y", .[1, "Year"],
                           "-p", .[1, "Plot"],
                           "-s", .[1, "SampleID"])
       # initialize the file
       png(filename = paste0(group_name, ".png"))
       # draw the plot
       plot(.[["x"]], .[["y"]])
       # close the file
       dev.off()
       # dplyr will be happy if we return a data frame
       return(.)
    })

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

group_by(base_data, Year, Plot, SampleID) %>%
    do({
       group_name = paste0("y", .[1, "Year"],
                           "-p", .[1, "Plot"],
                           "-s", .[1, "SampleID"])
       png(filename = paste0(group_name, ".png"))
       plot(.[["x"]], .[["y"]])
       dev.off()
       return(.)
    })
Другие вопросы по тегам