我在一个字符向量中有一个很长的列名列表,这些列名指的是各种药物。我喜欢将该列表放在代码的顶部,以便于编辑和引用脚本中不同位置的药物组。我想使用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
发布于 2019-04-10 20:13:20
这可能不是最dplyr
的答案,但您可以始终在mutate
中使用apply
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
发布于 2019-04-10 19:56:28
你也可以整理数据,首先让它变长,然后找到最大值并将其连接到原始数据上。注意在这里你必须使用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]))
发布于 2021-08-09 05:19:44
在初始尝试中使用c_across
似乎是可行的:
mycols <- c("vs", "am", "gear", "carb")
df <- mtcars %>%
rowwise() %>%
mutate(MAX = max(c_across(all_of(mycols))))
https://stackoverflow.com/questions/55620024
复制相似问题