【问题标题】:Finding maximum value of one column (by group) and inserting value into another data frame in R查找一列的最大值(按组)并将值插入到 R 中的另一个数据框中
【发布时间】:2013-07-06 13:20:57
【问题描述】:

全部,

我希望有人能找到我的问题的解决方案,这不一定会引起头痛,但截至目前,在为我所在的项目创建数据集时可能会出现人为错误工作。

我现在使用的数据集是 1950 年到 2010 年间每年选定国家对的有向二元年(A 与 B,B 与 A)数据集。一些国家,如 A 在我的例子,将与世界上每个国家配对,每个国家都将与之配对。一些国家,比如我的例子中的 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 的最大值是多少(与国家 E 配对时为 95)。我还想知道在给定年份的任何配对中x2x3x4 的最大值是多少(分别是国家 D、国家 H 和国家 C 的 90、25 和 90 )。

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

【问题讨论】:

    标签: r data-manipulation


    【解决方案1】:

    如果你知道 SQL,那么你可以使用这个包中的sqldffunction: 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
    

    【讨论】:

      【解决方案2】:

      您也可以使用 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
      

      【讨论】:

        【解决方案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
        

        你的问题不是很清楚你想如何从那里继续......

        【讨论】:

        • 这不是我想要的,但它确实让这项工作变得轻松了很多。我认为,从那里,我可以很容易地隔离给定国家在给定年份的价值观。非常感谢您推荐这条路线。
        • @sm8402,如果你能澄清你的问题,我很高兴再试一次!
        • 老实说,我认为你回答我的问题比我问的好。我最初想要得到的可能是给定国家在给定年份的 1x5 输出。你给我的aggregate 函数只是给了我所有国家所有年份的最大值,但是,当导出为 CSV 时,我能够更好地将感兴趣的行复制粘贴到我正在处理的另一个数据集中.您的解决方案比我最初要求的要方便一些。 :-)
        • 干得好,我的意思是阿南达 - 我没有意识到你可以在 aggregate 的 LHS 上使用 cbind。你每天都会学到新东西。
        猜你喜欢
        • 2022-12-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-05-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多