通过使用dplyr中列名称的向量在各列中查找最大行数

时间:2019-04-10 19:30:55

标签: r dplyr

我在字符向量中有很长的列名称列表,这些列名称涉及各种药物。我喜欢将该列表保留在代码的顶部,以便于在脚本的各个位置轻松进行编辑和引用药物组。我想通过使用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

4 个答案:

答案 0 :(得分:0)

您可以使用summarise_at中的dplyr来总结选择的列数或列向量,例如:

data(mtcars)

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

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

  vs am gear carb
1  1  1    5    8

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

答案 1 :(得分:0)

您还可以整理数据,方法是先使其变长,然后再找到最大值并将其加入原始数据。请注意,您必须在此处使用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]))

答案 2 :(得分:0)

这可能不是最dplyr的答案,但是您可以始终在apply内使用mutate

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

答案 3 :(得分:0)

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

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

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