Суммировать объект в столбце между интервалами, определенными другим столбцом - PullRequest
4 голосов
/ 05 мая 2011

У меня есть такой кадр данных:

  df
       A B
 [1,]  1 4
 [2,]  2 3
 [3,]  3 5
 [4,]  4 7
 [5,]  5 5
 [6,]  6 7
 [7,]  7 4
 [8,]  8 7
 [9,]  9 3
[10,] 10 7

Мне нужно сложить числа в столбце B, которые попадают в интервал, определенный столбцом A. Например, сумма в B между A≥1 и A <3. </p>

Я пытаюсь использовать это:

> sum(which(df$B[df$A>=1] & df$B[df$A<3]))

, но это не дает мне то, что я хочу.

Ответы [ 2 ]

9 голосов
/ 05 мая 2011

Ты почти там.

with(my.df, sum(my.df[A >= 1 & A < 3, "B"]))

РЕДАКТИРОВАТЬ

Чейз попросил меня объяснить код под рукой.При чтении R-кода лучше читать изнутри наружу.Здесь мы идем.

my.df - это data.frame (пример таблицы Excel) со столбцами A и B.Квадратные скобки [] используются для подстановки всего из этого объекта следующим образом: [rows, columns].Например, [1, ] вернет всю первую строку, и если вы добавите номер столбца (или имя столбца), вы получите значение в первой строке этого столбца (например, [1, 2], где вы получите значение в первой строке).второй колонки).Теперь мы поместим строки в my.df с A >= 1 & A < 3.Мы говорим здесь о том, что мы хотим видеть те строки, значения которых в A больше или равны 1 и меньше 3. Это даст нам все строки, которые удовлетворяют этому критерию.Если мы добавим , "B", это означает, что мы хотим выбрать столбец B.Поскольку мы уже поднастроили результат, чтобы он содержал только строки, соответствующие вышеуказанному критерию, введя имя столбца B, мы получим значения только в столбце.Получив эти значения из столбца B, вы суммируете их, используя sum().Использование функции with облегчает нашу жизнь.Если бы мы не использовали это, мы были бы вынуждены вызывать столбцы по их полному имени my.df$A и my.df$B.

2 голосов
/ 05 мая 2011

Другая опция, использующая параметр выбора из подмножества, дает идентичные результаты.: sum(subset(dat, A < 3 & A >= 1, select = "B"))

Ответ Романа быстрее, но, возможно, его не так просто отнести к неопытному эксперту.В зависимости от вашей аудитории (т. Е. Обмена сценариями с коллегами) и ограничений производительности, одно может быть предпочтительнее другого.

> system.time(replicate(100,with(dat, sum(dat[A >= 1 & A < 3, "B"]))))
   user  system elapsed 
  0.008   0.000   0.008 
> system.time(replicate(100, sum(subset(dat, A < 3 & A >= 1, select = "B"))))
   user  system elapsed 
  0.041   0.000   0.041 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...