繁体   English   中英

使用 dplyr 中的列名向量在列中查找行最大值

[英]Find row maximum across columns by using vector of column names in dplyr

我在一个字符向量中有很长的列名列表,它们指的是各种药物。 我喜欢将该列表保留在我的代码顶部,以便在我的脚本中的各个点轻松编辑和引用药物组。 我想使用 dplyr 通过向它提供列名的预定义向量以找到最大跨度来获取药物的行最大值。 似乎有一个简单的修复方法,但今天它正在逃避我...

我尝试了下面的代码,但它返回列名列表中的名称之一。

我还使用 get()、select() 和 do.call() 尝试了各种排列来尝试让 R 以不同的方式读取字符向量,但我无法弄清楚......

data(mtcars)

colnames <- c("vs", "am", "gear", "carb")

df <- mtcars %>%
  rowwise() %>%
  mutate(max = max(colnames))

编辑:我希望在新列中显示最大值。 例如,我希望输出如下:

vs am gear carb MAX
0  1   4    4    4
0  1   4    4    4
1  1   4    1    4
1  0   3    1    3
0  0   3    2    3

你可以总结出列选择号码或如您有,使用的列向量summarise_atdplyr

data(mtcars)

colnames <- c("vs", "am", "gear", "carb")

df <- mtcars %>%
  summarise_at(colnames, list(max))

  vs am gear carb
1  1  1    5    8

您只需先指定列,然后再运行; 在这种情况下max 它是相同的语法select_atmutate_atrename_at -您使用summarise_at ,因为你保留指定的列,而不是创建新的。

您还可以整理数据,方法是先使其变长,然后找到最大值,然后将其加入原始数据。 请注意,您必须在此处使用gather_()并将所有名称都用引号引起来,以便可以引用向量。 在此示例中,我将汽车用作您的药物,但没有解决最大价值的问题。

library(dplyr)
library(tidyr)
colnames <- c("vs", "am", "gear", "carb")

df <- mtcars %>%
      mutate(nms = row.names(mtcars)) 
#transpose then find max value and keep max value
dfx <-  tidyr::gather_(df, 'nms2','vals', colnames) %>% 
        group_by(nms) %>% 
        mutate(max = max(vals)) %>% 
        ungroup %>% 
        filter(max == vals)
#join back on to data with column name and max value 
mt2 <- left_join(df,select(dfx, nms, vals,nms2),by='nms')

使用pmax和更少的代码

您可以在do.call内使用pmax到按行最大值

df <- mtcars %>% 
      mutate(mx2 = do.call(pmax,mtcars[,colnames]))

它可能不是最dplyr答案,但是您始终applymutate内部使用apply

mtcars %>%
  mutate(max_val = apply(., 1, function(x) max(x[col_names]))) %>%
  head()

   mpg cyl disp  hp drat    wt  qsec vs am gear carb max_val2 max_val
1 21.0   6  160 110 3.90 2.620 16.46  0  1    4    4        4       4
2 21.0   6  160 110 3.90 2.875 17.02  0  1    4    4        4       4
3 22.8   4  108  93 3.85 2.320 18.61  1  1    4    1        4       4
4 21.4   6  258 110 3.08 3.215 19.44  1  0    3    1        3       3
5 18.7   8  360 175 3.15 3.440 17.02  0  0    3    2        3       3
6 18.1   6  225 105 2.76 3.460 20.22  1  0    3    1        3       3

或者,您可以执行以下操作:

mtcars$max_val2 <- mtcars %>%
  select(col_names) %>%
  transmute(apply(., 1, max)) %>%
  pull()
head(mtcars)

                   mpg cyl disp  hp drat    wt  qsec vs am gear carb max_val2
Mazda RX4         21.0   6  160 110 3.90 2.620 16.46  0  1    4    4        4
Mazda RX4 Wag     21.0   6  160 110 3.90 2.875 17.02  0  1    4    4        4
Datsun 710        22.8   4  108  93 3.85 2.320 18.61  1  1    4    1        4
Hornet 4 Drive    21.4   6  258 110 3.08 3.215 19.44  1  0    3    1        3
Hornet Sportabout 18.7   8  360 175 3.15 3.440 17.02  0  0    3    2        3
Valiant           18.1   6  225 105 2.76 3.460 20.22  1  0    3    1        3

在您的初始尝试中使用c_across似乎有效:

mycols <- c("vs", "am", "gear", "carb")

df <- mtcars %>% 
  rowwise() %>%
  mutate(MAX = max(c_across(all_of(mycols)))) 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM