【问题标题】:R - Find three top values based on other columnR - 根据其他列查找三个最高值
【发布时间】:2018-01-29 15:20:28
【问题描述】:

我有一个数据框(但也可以是数据表),其中包含多个站点(其余列“a”到“l”)中植被类型的比例(第一列“type”)。这是它的样子:

dat <- structure(list(type = structure(1:17, class = "factor", .Label = c("not_vegetated", 
"needleleaf_evergreen_temperate_tree", "needleleaf_evergreen_boreal_tree", 
"needleleaf_deciduous_boreal_tree", "broadleaf_evergreen_tropical_tree", 
"broadleaf_evergreen_temperate_tree", "broadleaf_deciduous_tropical_tree", 
"broadleaf_deciduous_temperate_tree", "broadleaf_deciduous_boreal_tree", 
"broadleaf_evergreen_shrub", "broadleaf_deciduous_temperate_shrub", 
"broadleaf_deciduous_boreal_shrub", "c3_arctic_grass", "c3_non.arctic_grass", 
"c4_grass", "c3_crop", "c3_irrigated")), a = c("0", "1.55", "0", 
"0", "0", "0", "0", "11.59", "0", "0", "0", "0", "0", "31.5", 
"0.26", "52.29", "0"), b = c("0", "8.27", "0.02", "0", "0", "0", 
"0", "35.5", "0.05", "0", "0.04", "0", "0", "26.02", "0", "15.7", 
"0"), c = c("1.42", "7.55", "0", "0", "0", "0", "0", "14.24", 
"2.38", "0", "0.06", "0", "0", "31.79", "0", "36.56", "0"), d = c("0", 
"13.87", "3.97", "0", "0", "0", "0", "51.66", "7.68", "0", "0.07", 
"0", "0", "8.18", "0", "10.23", "0"), e = c("0", "16.23", "0.24", 
"0", "0", "0", "0", "67.15", "2.12", "0", "0", "0", "0", "6.52", 
"0.1", "4.68", "0"), f = c("0.26", "6.29", "60.98", "0", "0", 
"0", "0", "3.72", "10.49", "0", "0", "0.3", "2.45", "3.61", "0", 
"3.9", "0"), g = c("0.11", "38.16", "10.9", "0", "0", "0", "0", 
"31.72", "13.53", "0", "0", "0", "0", "0.68", "0", "0.9", "0"
), h = c("0", "10.42", "0.42", "0", "0", "0", "0", "55.44", "1.49", 
"0", "0", "0", "0", "16.54", "0", "13.33", "0"), i = c("0", "1.39", 
"0", "0", "0", "0", "0", "11.56", "0", "0", "0", "0", "0", "33.94", 
"0", "49.26", "0"), j = c("0.45", "16.48", "0", "0", "0", "0", 
"0", "40.02", "0", "0", "0.02", "0", "0", "17.53", "0", "10.51", 
"0"), k = c("6.02", "2.78", "0", "0", "0", "0", "0", "1.27", 
"2.51", "0", "0.03", "0", "0", "18.29", "0", "69.1", "0"), l = c("6.13", 
"22.77", "2.72", "0", "0", "0", "0", "22.69", "3.85", "0", "0.06", 
"0", "0", "1.25", "0", "1.53", "0")), .Names = c("type", 
"a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l"), row.names = c(NA, 
-17L), class = "data.frame")

我需要做的是计算每个站点的三个更丰富的植被类型分数,并将其汇总在与此类似的数据框(或数据表)中(为简洁起见仅显示前两个站点):

            a                                                   b
c3_crops (52.29)                                broadleaf_deciduous_temperate_tree (35.5)
c3_non.arctic_grass (31.5)                      c3_non.arctic_grass (26.02)
broadleaf_deciduous_temperate_tree (11.59)      c3_crop (15.7)

关于如何做到这一点的任何提示?

【问题讨论】:

    标签: r dataframe data.table topmost


    【解决方案1】:

    这是适合您的一种方法。如果我没看错你的问题,你想选择三个数字最高的三个站点。您首先要以长格式格式化数据,将字符转换为数字,然后按sitevalue 对数据进行排序。然后,您通过site 定义组,并为每个组获取前三行。

    library(dplyr)
    library(tidyr)
    
    gather(dat, key = site, value = value, -type) %>%
    mutate(value = as.numeric(value)) %>%
    arrange(site, desc(value)) %>%
    group_by(site) %>%
    top_n(3)
    
       type                               site  value
       <fct>                              <chr> <dbl>
     1 c3_crop                            a      52.3
     2 c3_non.arctic_grass                a      31.5
     3 broadleaf_deciduous_temperate_tree a      11.6
     4 broadleaf_deciduous_temperate_tree b      35.5
     5 c3_non.arctic_grass                b      26.0
     6 c3_crop                            b      15.7
     7 c3_crop                            c      36.6
     8 c3_non.arctic_grass                c      31.8
     9 broadleaf_deciduous_temperate_tree c      14.2
    10 broadleaf_deciduous_temperate_tree d      51.7
    # ... with 26 more rows
    

    【讨论】:

    • 加载函数gathermutategroup_by和运算符%&gt;%需要什么包?
    • @thiagoveloso 对不起。您可以直接致电library(tidyverse) 或致电 dplyr 和 tidyr。
    【解决方案2】:

    考虑将您的数据从宽调整为长,并将byorderhead(...,3) 全部使用基数R。by 下方返回数据帧的命名列表。

    # RESHAPE DATA
    rdat <- reshape(dat, timevar = "site", times = letters[1:12], varying = list(2:13), 
                    v.names = "value", new.row.names = 1:1000, direction = "long")
    
    rdat$value <- as.numeric(rdat$value)
    
    # ORDER DATA
    rdat <- with(rdat, rdat[order(site, -value),])  
    
    # SUBSET BY SITE, RETURN TOP 3 ROWS
    by(rdat, rdat$site, FUN=function(i) head(i, 3))
    
    # rdat$site: a
    #                                  type site value id
    # 16                            c3_crop    a 52.29 16
    # 14                c3_non.arctic_grass    a 31.50 14
    # 8  broadleaf_deciduous_temperate_tree    a 11.59  8
    # --------------------------------------------------------------------------------
    # rdat$site: b
    #                                  type site value id
    # 25 broadleaf_deciduous_temperate_tree    b 35.50  8
    # 31                c3_non.arctic_grass    b 26.02 14
    # 33                            c3_crop    b 15.70 16
    # --------------------------------------------------------------------------------
    # rdat$site: c
    #                                  type site value id
    # 50                            c3_crop    c 36.56 16
    # 48                c3_non.arctic_grass    c 31.79 14
    # 42 broadleaf_deciduous_temperate_tree    c 14.24  8
    # ...
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-08-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-09-27
      • 2019-12-16
      • 1970-01-01
      相关资源
      最近更新 更多