r-从多个列中识别一行中的最大值,输出包括数据集中的所有列



我有一个相当大的数据集,我需要从几个列中确定每行的最大值。因此,在下面的样本数据中,对于"II",最高值是什么,以及最高值是否在"N"或"P"中。我知道之前已经发布了与此非常类似的问题,但我需要输出以避免删除数据集中的其他元数据列。这也意味着我需要指定应该包含在"max"查询中的列的范围。提前感谢您的指导。

data<-data_frame(Exp = c("I", "II", "III", "IV", "V", "VI", "VII", "VIII"),
N = c(8.77, 1.67, 7.47, 7.58, 1.1, 8.9, 7.5, 7.7),
P = c(1.848, 3.029, 1.925, 2.725, 1.900, 3.100, 
2.000, 9.800))

我已经尝试了以下代码的几种变体

test %>% 
mutate(Max = pmax(!!! rlang::syms(names(.)[c("N", "P"),]))) %>% 
group_by(data, Exp) %>% 
summarise(Max = max(Max))

并接收错误:UseMethod中的错误("mute_"(:没有适用于"函数"类对象的"变异_"方法

这是我在这里提出的第一个问题,所以对任何不正确的格式等表示歉意,对此(以及我的问题(的任何建议都将不胜感激。

我分两步考虑

  1. 查找列的最大值
  2. 查找与最大值匹配的标签(假设值不相等(

如果只有两列NP,那么使用case_when可以直接执行此操作。

data2 = data %>%
mutate(max_val = pmax(N,P)) %>%                  # find max
mutate(source = case_when(max_val == N ~ "N",    # find label
max_val == P ~ "P"))

但是,如果列数或列名是动态的,那么这将变得更加困难。我有以下工作:

cols = c("N", "P")    # list of column names to work with
data2 = data %>%
mutate(max_val = pmax(!!!syms(cols))) %>%   # find max
mutate(source = NA)                         # initialize blank labels
# iterate to find labels
data3 = data2
for(c in cols)
data3 = mutate(data3, source = ifelse(is.na(source) & max_val == !!sym(c), c, source))

可能有一种方法可以将symcase_when组合起来,这样就不必对标签进行迭代。如果有人找到它,请发布此答案的更新。

为了解决同一个问题,我找到了一个不同的解决方案,这对我来说更清楚。
cur_data返回当前工作组
rowwise可以指定在使用summary时像组一样工作的列
ungroup需要恢复到默认的逐列格式
summary方法删除非分组变量。

# using names    
v = c('N', 'P')
data %>% rowwise %>% mutate(m=max(cur_data()[v])) %>% ungroup
# using ranges
start = 8
end = 25
data %>% rowwise %>% mutate(m=max(cur_data()[start:end])) %>% ungroup
# using summarize
data %>% rowwise(Exp) %>% summarize(m=max(cur_data()))

最新更新