我有一个相当大的数据集,我需要从几个列中确定每行的最大值。因此,在下面的样本数据中,对于"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_"(:没有适用于"函数"类对象的"变异_"方法
这是我在这里提出的第一个问题,所以对任何不正确的格式等表示歉意,对此(以及我的问题(的任何建议都将不胜感激。
我分两步考虑
- 查找列的最大值
- 查找与最大值匹配的标签(假设值不相等(
如果只有两列N
和P
,那么使用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))
可能有一种方法可以将sym
和case_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()))