Как ссылаться на столбцы data.frame внутри data.frame?

StackOverflow https://stackoverflow.com/questions/2329036

  •  22-09-2019
  •  | 
  •  

Вопрос

У меня есть 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 ]
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top