首页 > 解决方案 > 通过使用 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

标签: rdplyr

解决方案


您还可以通过先将其变长然后找到最大值并将其加入原始数据来整理数据。请注意,您必须在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 和更少的代码

您可以在 a 中使用 pmaxdo.call到逐行最大值

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

推荐阅读