Доступ к данным в 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(.)
})