【问题标题】:R - Sorting and Sub-setting Maximum Values within ColumnsR - 对列中的最大值进行排序和子设置
【发布时间】:2011-03-19 22:30:30
【问题描述】:

我正在尝试对列中的数据进行迭代排序以提取 N 个最大值。

我的数据设置为包含职业名称和代码的第一列和第二列,其余所有列包含这些职业的比较值(在这种情况下,必须预先为每个城市计算的位置商)不同城市:

    *occ_code  city1  ...   city300*
     occ1      5      ...    7
     occ2      20     ...   22
     .         .       .     .
     .         .       .     .
     occ800    20     ...   25

对于我想按最大值排序的每个城市,选择与它们各自的职业头衔和头衔匹配的最大值的子集。我认为这将是相对微不足道的,但是......

编辑澄清:我想以数据的排序子集结束分析。

     occ_code   city1
     occ200     10
     occ90      8
     occ20      2
     occ95      1.5

同时我希望能够按列重复排序(所以我通过直接调用列尝试了很多排序命令:data[,2]; 只是为了能够运行相同的分析函数覆盖整个数据集。

过去 3 天我一直在搞乱 plyr,我觉得我的数据集的设置不利于 plyer 的使用方式。

【问题讨论】:

  • 你能澄清一下这个问题吗?给我们一个以较小数据框作为输入的示例以及您要提取的输出示例将有所帮助。
  • 是的,在这里很难弄清楚你想要什么。
  • 首先,我想得到一个包含两列数据的子集:列“city1”的10个最大值的列表,与它们各自的“occ_codes”匹配,(来自第一列) .这在 excel 中将是一个足够简单的排序,只是我需要重复操作 300 次 * 10 年的数据。

标签: sorting r subset


【解决方案1】:

根据您的示例代码段,我不确定您想要的输出是什么。以下是如何使用 plyrreshape 为每个城市获取这样的数据框

#using the same df from nico's answer
library(reshape)
df.m <- melt(df, id = 1)
a.cities <- cast(df.m, codes ~ . | variable)

library(plyr)
a.cities.max <- aaply(a.cities, 1, function(x) arrange(x, desc(`(all)`))[1:4,])

现在,a.cities.max 是一个数据框数组,每个数据框中的每个城市都有 4 个最大值。要获取这些数据帧之一,您可以使用

对其进行索引
a.cities.max$X13

我不知道你将如何处理这些数据,但你可能希望它以数据框格式返回。

df.cities.max <- adply(a.cities.max, 1)

【讨论】:

    【解决方案2】:

    一种方法是使用 orderddply 包中的 plyr

    > library(plyr)
    > d<-data.frame(occu=rep(letters[1:5],2),city=rep(c('A','B'),each=5),val=1:10)
    > ddply(d,.(city),function(x) x[order(x$val,decreasing=TRUE)[1:3],])
    

    order 可以根据需要对多列进行排序。

    【讨论】:

      【解决方案3】:

      这将输出每个城市的最大值。使用sortorder可以获得类似的结果

      # Generate some fake data
      codes <- paste("Code", 1:100, sep="")
      values <- matrix(0, ncol=20, nrow=100)
      for (i in 1:20)
          values[,i] <- sample(0:100, 100, replace=T)
      
      df <- data.frame(codes, values)
      
      names(df) <- c("Code", paste("City", 1:20, sep=""))
      
      # Now for each city we get the maximum
      maxval <- apply(df[2:21], 2, which.max)
      # Output the max for each city
      print(cbind(paste("City", 1:20), codes[maxval]))
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-08-01
        • 2012-08-11
        • 1970-01-01
        • 2019-10-14
        • 2018-06-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多