所有
我希望有人可以找到我的问题的解决方案,这不一定会导致令人头疼的问题,但是,就目前而言,在为我正在制作的项目创建数据集时会引发人为错误的可能性工作
我现在使用的数据集是1950年到2010年间每年选定国家/地区的定向二元年(A对B,B对A)数据集。有些国家/地区,如A in in我的例子,将与世界上每个国家配对,每个国家都将与之配对。一些国家,例如我的例子中的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年对A国感兴趣。我想知道2000年x1
的最大值是什么(95,与E国配对) 。我还想知道在给定年份的任何配对中x2
,x3
和x4
的最大值是什么(国家D,国家/地区为90,25和90)分别为H和C国。)
1998年的B国和2005年的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年代表国家A而不是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
答案 0 :(得分:4)
听起来你只是在寻找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
从你的问题中你不清楚你想从那里开始......
答案 1 :(得分:3)
您也可以使用plyr包中的ddply
。假设您的样本是数据。
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
答案 2 :(得分:1)
如果你知道SQL,那么你可以使用这个包中的sqldf
函数:
http://cran.r-project.org/web/packages/sqldf/index.html
df <- 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