Как ссылаться на столбцы data.frame внутри data.frame?
Вопрос
У меня есть data.frame с именем series_to_plot.df, который я создал, объединив ряд других data.frames вместе (показано ниже).Теперь я хочу извлечь только столбец .mm из каждого из них, чтобы я мог нанести их на график.Итак, я хочу извлечь 3-й столбец из каждого data.frame (напримерp3c3.mm , p3c4.mm и т.д. ...), но я не вижу, как это сделать для всех data.frames в объекте без перебора имени.Возможно ли это?
Я могу вытащить только один комплект:например ,series_to_plot.df[[3]] и другой по
series_to_plot.df[[10]] (так что это просто список векторов ..) и я могу напрямую ссылаться на series_to_plot.df $p3c3.mm , но есть ли команда для получения вектора, содержащего все мм из каждого data.frame?Я ожидал, что индекс, подобный этому, сработает:series_to_plot.df[,3[3]] но он возвращает ошибку в [.data.frame
(series_to_plot.df, , 3[3]) :выбранные неопределенные столбцы
series_to_plot.df
p3c3.rd p3c3.day p3c3.mm p3c3.sd p3c3.n p3c3.noo p3c3.no_NAs
1 2010-01-04 0 0.1702531 0.04003364 7 1 0
2 2010-01-06 2 0.1790594 0.04696674 7 1 0
3 2010-01-09 5 0.1720404 0.03801756 8 0 0
p3c4.rd p3c4.day p3c4.mm p3c4.sd p3c4.n p3c4.noo p3c4.no_NAs
1 2010-01-04 0 0.1076581 0.006542157 6 2 0
2 2010-01-06 2 0.1393447 0.066758781 7 1 0
3 2010-01-09 5 0.2056846 0.047722862 7 1 0
p3c5.rd p3c5.day p3c5.mm p3c5.sd p3c5.n p3c5.noo p3c5.no_NAs
1 2010-01-04 0 0.07987147 0.006508766 7 1 0
2 2010-01-06 2 0.11496167 0.046478767 8 0 0
3 2010-01-09 5 0.40326471 0.210217097 7 1 0
Решение
В дополнение к другим ответам, я не думаю, что это хорошая идея - иметь полезную информацию, закодированную в именах переменных.Гораздо лучше переставить ваши данные так, чтобы вся полезная информация содержалась в значении какой-нибудь переменной.Я недостаточно знаю о вашем наборе данных, чтобы предложить правильный формат, но это может быть что-то вроде
p c rd day date mm sd ...
3 3 2010-10-04 ...
Как только вы сделаете это, ответ на ваш вопрос станет простым df$mm
.
Если вы получаете данные в менее удобной форме из внешнего источника, вы можете изменить их в более удобной форме, подобной приведенной выше, внутри R, используя reshape
функция или функции из reshape
посылка.
Другие советы
Чтобы получить все столбцы с указанным именем, вы могли бы сделать:
names_with_mm <- grep("mm$", names(series_to_plot.df), value=TRUE)
series_to_plot.df[, names_with_mm]
Но если ваша база data.frame
все они имеют одинаковую структуру, тогда вы можете rbind
их, что-то вроде:
series_to_plot.df <- rbind(
cbind(name="p3c3", p3c3),
cbind(name="p3c4", p3c4),
cbind(name="p3c5", p3c5)
)
Тогда mm
значения находятся в одном столбце, и его легче вывести на график.
В Определение языка R содержит некоторую хорошую информацию об индексации (раздел 3.4.1), которая довольно полезна.
Затем вы можете извлечь имена, соответствующие последовательности, с помощью команды grep().Затем соедините все это вместе вот так:
dataWithMM <- series_to_plot.df[,grep("[P]", names(series_to_plot.df))]
чтобы немного деконструировать его, получаем количество столбцов, соответствующих шаблону "мм":
namesThatMatch <- grep("[mm]", names(series_to_plot.df)
Затем мы используем этот список для вызова нужных нам столбцов:
dataWithMM <- series_to_plot.df[, namesThatMatch ]