簡體   English   中英

在一行中找到最大值,然后與其他行中的最大值進行比較

[英]Find maximum in one row and compare with max in other rows

我正在尋找過濾數據的最簡單方法:

讓我們以其中一個為例:

structure(list(mpg = c(21, 21, 22.8, 21.4, 18.7, 18.1, 14.3, 
                       24.4, 22.8, 19.2), cyl = c(6, 6, 4, 6, 8, 6, 8, 4, 4, 6), disp = c(160, 
                                                                                          165, 108, 258, 360, 225, 360, 146.7, 140.8, 167.6), hp = c(310, 
                                                                                                                                                     110, 93, 110, 475, 105, 245, 62, 95, 223), drat = c(3.9, 3.9, 
                                                                                                                                                                                                         3.85, 3.08, 3.15, 2.76, 633.21, 3.69, 3.92, 3.92), wt = c(2.62, 
                                                                                                                                                                                                                                                                 2.875, 2.32, 3.215, 3.44, 3.46, 3.57, 3.19, 3.15, 3.44), qsec = c(16.46, 
                                                                                                                                                                                                                                                                                                                                   17.02, 18.61, 19.44, 17.02, 20.22, 15.84, 20, 22.9, 18.3), vs = c(0, 
                                                                                                                                                                                                                                                                                                                                                                                                     0, 1, 1, 0, 1, 0, 1, 1, 1), am = c(1, 1, 1, 0, 0, 0, 0, 0, 0, 
                                                                                                                                                                                                                                                                                                                                                                                                                                        0), gear = c(4, 4, 4, 3, 3, 3, 3, 4, 4, 4), carb = c(4, 4, 1, 
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             1, 2, 1, 4, 2, 2, 4)), .Names = c("mpg", "cyl", "disp", "hp", 
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               "drat", "wt", "qsec", "vs", "am", "gear", "carb"), row.names = c("Mark_1", 
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                "Mark_2", "Mark_3", "Tom_1", "Tom_2", "Tim_1", "Greg_1", "Greg_2", 
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                "Greg_3", "Greg_4"), class = "data.frame")

我想過濾具有“相同”名稱的行,並只保留一個。 一些名稱的區別僅在於_之后的數字。 這些應該相互比較。

過濾條件:

首先,我想在每一行中找到最大值,然后將這些最大值與具有相同名稱的行進行比較。 最大值最高的行應保留

如果我沒記錯的話,可以得到預期的輸出:

structure(list(mpg = c(21, 18.7, 18.1, 14.3), cyl = c(6, 8, 6, 
8), disp = c(160, 360, 225, 360), hp = c(310, 475, 105, 245), 
    drat = c(3.9, 3.15, 2.76, 633.21), wt = c(2.62, 3.44, 3.46, 
    3.57), qsec = c(16.46, 17.02, 20.22, 15.84), vs = c(0, 0, 
    1, 0), am = c(1, 0, 0, 0), gear = c(4, 3, 3, 3), carb = c(4, 
    2, 1, 4)), .Names = c("mpg", "cyl", "disp", "hp", "drat", 
"wt", "qsec", "vs", "am", "gear", "carb"), row.names = c("Mark_1", 
"Tom_2", "Tim_1", "Greg_1"), class = "data.frame")

> datas
        mpg cyl disp  hp   drat   wt  qsec vs am gear carb
Mark_1 21.0   6  160 310   3.90 2.62 16.46  0  1    4    4
Tom_2  18.7   8  360 475   3.15 3.44 17.02  0  0    3    2
Tim_1  18.1   6  225 105   2.76 3.46 20.22  1  0    3    1
Greg_1 14.3   8  360 245 633.21 3.57 15.84  0  0    3    4

我們split數據集splitdata.frame listdata.frame是在刪除子字符串_后再加上數字( \\\\d+ ),然后使用行名稱創建分組變量,然后遍歷list ,找到每一行的最大值( pmax ),獲得最大值(指數which.max ),用它來子集行, rbind行一起

do.call(rbind, setNames(lapply(split(df1, sub("_\\d+", "", rownames(df1))),
             function(x) x[which.max(do.call(pmax, x)),]), NULL))
#        mpg cyl disp  hp   drat   wt  qsec vs am gear carb
#Greg_1 14.3   8  360 245 633.21 3.57 15.84  0  0    3    4
#Mark_1 21.0   6  160 310   3.90 2.62 16.46  0  1    4    4
#Tim_1  18.1   6  225 105   2.76 3.46 20.22  1  0    3    1
#Tom_2  18.7   8  360 475   3.15 3.44 17.02  0  0    3    2

或使用ave ,我們創建一個邏輯索引。 獲取每行的maxdo.call(pmax, df1) ),使用子字符串后的行名稱作為分組變量,獲取max ,與元素進行比較( == ),將行轉換為邏輯行並對其進行子集化

df1[with(df1, as.logical(ave(do.call(pmax, df1), sub("_\\d+", "", rownames(df1)), 
                          FUN = function(x) x==max(x)))),]
#        mpg cyl disp  hp   drat   wt  qsec vs am gear carb
#Mark_1 21.0   6  160 310   3.90 2.62 16.46  0  1    4    4
#Tom_2  18.7   8  360 475   3.15 3.44 17.02  0  0    3    2
#Tim_1  18.1   6  225 105   2.76 3.46 20.22  1  0    3    1
#Greg_1 14.3   8  360 245 633.21 3.57 15.84  0  0    3    4

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM