我在字符向量中有很长的列名称列表,这些列名称涉及各种药物。我喜欢将该列表保留在代码的顶部,以便于在脚本的各个位置轻松进行编辑和引用药物组。我想通过使用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
答案 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
您只需先指定列,然后再执行功能;在这种情况下,max
。 select_at
,mutate_at
和rename_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')
您可以在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))))