Поиск максимального значения одного столбца (по группе) и вставка значения в другой фрейм данных в R
Все,
Я надеялся, что кто-то сможет найти решение моей проблемы, которая не обязательно вызывает головную боль, но, на данный момент, предполагает возможность человеческой ошибки при создании набора данных для проекта, над которым я работаю.Набор данных, который я использую сейчас, представляет собой направленную Диаду-год (A против B, B против A) для выбранных пар стран за каждый год между 1950 и 2010 годами. Некоторые страны, как А в моем примере, будут объединены с каждой страной мира. мир и каждая страна будут в паре с ним. Некоторые страны, такие как B и C в моем примере, будут объединены всего с несколькими странами. Некоторые пары будут иметь недостающие данные, которые я не показываю в своем примере.
Что я хотел бы сделать, так это использовать R, чтобы найти максимальное значение данного столбца для данной страны в данном году и вставить это значение в другой фрейм данных. Надеюсь, эта иллюстрация прояснит, что я хотел бы сделать.
country1 country2 year x1 x2 x3 x4
A B 2000 50 30 1 20
A C 2000 70 2 5 90
A D 2000 10 90 20 30
A E 2000 95 10 10 5
A F 2000 10 10 10 0
A G 2000 5 5 0 0
A H 2000 10 30 25 40
........................................
B A 1998 5 10 30 2
B D 1998 30 6 9 0
B I 1998 10 9 7 0
........................................
C A 2005 10 15 2 6
C D 2005 90 0 0 40
C X 2005 49 90 5 0
Скажем, например, что мне интересно в стране а в 2000 году. Я хочу знать, каково его максимальное значение x1
в 2000 году (которое составляет 95, в его сопряжении со страной е). Я также хочу знать, что такое его максимальное значение для x2
, x3
, и x4
в любой паре в данном году (которые равны 90, 25 и 90 со страной D, страной H и страной C соответственно).
После выделения максимального значения этих столбцов для данной страны в данном году, я хотел бы сбросьте эти значения в фрейм данных, вот так.
country year x1max x2max x3max x4max
A 2000 95 90 25 90
B 1998 30 10 30 2
C 2005 90 90 5 40
Я гибок в этой части. Возможно, проще всего поместить эти максимальные значения для каждой страны в их собственные фреймы данных размером 1x5, а затем использовать rbind
для их объединения.
Воспроизводимый код следует, однако, поскольку мой вопрос делает я не уверен, что воспроизводимый код обязательно полезен для выделения конкретного года для конкретной страны (например, 2000 для страны а вместо 2001 года). Я надеюсь, что это так, или, по крайней мере, что мой вопрос ясен.
country1 <- c("A", "A", "A", "A", "A", "A", "A", "B", "B", "B", "C", "C", "C")
country2 <- c("B","C","D","E","F","G","H","A","D","I","A","D","X")
year <- c(2000, 2000, 2000, 2000, 2000, 2000, 2000, 1998, 1998, 1998, 2005, 2005, 2005)
x1 <- c(50, 70, 10, 95, 10, 5, 10, 5, 30, 10, 10, 90, 49)
x2 <- c(30, 2, 90, 10, 10, 5, 30, 10, 6, 9, 15, 0, 90)
x3 <- c(1, 5, 20, 10, 10, 0, 25, 30, 9, 7, 2, 0, 5)
x4 <- c(20, 90, 30, 5, 0,0,40,2,0,0,6,40,0)
Data=data.frame(country1=country1,country2=country2,year=year,x1=x1,x2=x2,x3=x3,x4=x4)
Data
3 ответа:
Похоже, вы просто ищете
aggregate
:> aggregate(cbind(x1, x2, x3, x4) ~ country1 + year, Data, max) country1 year x1 x2 x3 x4 1 B 1998 30 10 30 2 2 A 2000 95 90 25 90 3 C 2005 90 90 5 40
Однако из вашего вопроса не очень ясно, как вы хотите действовать дальше....
Вы также можете использовать
ddply
из пакета plyr. Предположим, что ваш образец-это данные.data<-structure(list(country1 = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 3L, 3L, 3L), .Label = c("A", "B", "C"), class = "factor"), country2 = structure(c(2L, 3L, 4L, 5L, 6L, 7L, 8L, 1L, 4L, 9L, 1L, 4L, 10L), .Label = c("A", "B", "C", "D", "E", "F", "G", "H", "I", "X"), class = "factor"), year = c(2000L, 2000L, 2000L, 2000L, 2000L, 2000L, 2000L, 1998L, 1998L, 1998L, 2005L, 2005L, 2005L), x1 = c(50L, 70L, 10L, 95L, 10L, 5L, 10L, 5L, 30L, 10L, 10L, 90L, 49L), x2 = c(30L, 2L, 90L, 10L, 10L, 5L, 30L, 10L, 6L, 9L, 15L, 0L, 90L), x3 = c(1L, 5L, 20L, 10L, 10L, 0L, 25L, 30L, 9L, 7L, 2L, 0L, 5L), x4 = c(20L, 90L, 30L, 5L, 0L, 0L, 40L, 2L, 0L, 0L, 6L, 40L, 0L)), .Names = c("country1", "country2", "year", "x1", "x2", "x3", "x4"), class = "data.frame", row.names = c(NA, -13L)) install.packages("plyr") library(plyr) ddply(data,.(country1,year),numcolwise(max)) country1 year x1 x2 x3 x4 1 A 2000 95 90 25 90 2 B 1998 30 10 30 2 3 C 2005 90 90 5 40
Если вы знаете SQL, то вы можете использовать функцию
sqldf
из этого пакета: http://cran.r-project.org/web/packages/sqldf/index.htmldf <- sqldf("select year, max(x1), max(x2), max(x3), max(x4) from Data group by year") df year max(x1) max(x2) max(x3) max(x4) 1 1998 30 10 30 2 2 2000 95 90 25 90 3 2005 90 90 5 40