如何在某些R函数中隐式调用列
R中有一些函数必须按名称显式调用列,例如如何在某些R函数中隐式调用列,r,tidyverse,R,Tidyverse,R中有一些函数必须按名称显式调用列,例如pmin。我的问题是如何解决这个问题,最好使用tidyverse 下面是一些示例数据 library(tidyverse) df <- tibble(a = c(1:5), b = c(6:10), d = c(11:15), e = c(16:20)) # A tibble: 5 x 4 a b d e <int>
pmin
。我的问题是如何解决这个问题,最好使用tidyverse
下面是一些示例数据
library(tidyverse)
df <- tibble(a = c(1:5),
b = c(6:10),
d = c(11:15),
e = c(16:20))
# A tibble: 5 x 4
a b d e
<int> <int> <int> <int>
1 1 6 11 16
2 2 7 12 17
3 3 8 13 18
4 4 9 14 19
5 5 10 15 20
这些都不起作用,我有点不知所措。使用
dplyr
和purr
的一个选项可能是:
df %>%
mutate(min = exec(pmin, !!!select(., -e)))
a b d e min
<int> <int> <int> <int> <int>
1 1 6 11 16 1
2 2 7 12 17 2
3 3 8 13 18 3
4 4 9 14 19 4
5 5 10 15 20 5
df %>%
mutate(min = do.call(pmin, select(., -e)))
我会通过重塑长形,按组计算最小值,然后重塑回宽形来实现这一点:
df %>%
rowid_to_column() %>%
pivot_longer(cols = -c(e, rowid)) %>%
group_by(rowid) %>%
mutate(min = min(value)) %>%
ungroup() %>%
pivot_wider() %>%
select(-rowid, -min, min)
我们还可以使用
reduce
和pmin
library(dplyr)
library(purrr)
df %>%
mutate(min = select(., -e) %>%
reduce(pmin))
# A tibble: 5 x 5
# a b d e min
# <int> <int> <int> <int> <int>
#1 1 6 11 16 1
#2 2 7 12 17 2
#3 3 8 13 18 3
#4 4 9 14 19 4
#5 5 10 15 20 5
mutate(min=invoke(pmin,select(,-e))
works@IceCreamToucan是的,但是,我使用的是exec()
,因为invoke()
根据它的文档是失效的:)嗯,没有注意到,信息是发送的。我想你也可以使用do.call
例如mutate(min=do.call(pmin,select(,-e))
,但可能不太整洁。我在想
可能效率不高,但如果在tidyverse中执行此类操作的唯一非退役方法是使用
这表明我的猜测可能是错的。@IceCreamToucan你肯定能做到,它甚至在exec()
的文档中提到过。在这种情况下,我决定坚持纯tidyverse
的可能性,因为OP显示了这样的兴趣:)do.call
版本也非常好。谢谢@IceCreamToucan。谢谢!看起来我已经接近syms的syms
版本了。看起来像是!!还有!!!符号随每次更新而变化。我希望他们很快就确定记谱法。或者我只是觉得他们一直在改变它。@hmhensen
用于单个名称字符,代码>适用于>=1
df %>%
rowid_to_column() %>%
pivot_longer(cols = -c(e, rowid)) %>%
group_by(rowid) %>%
mutate(min = min(value)) %>%
ungroup() %>%
pivot_wider() %>%
select(-rowid, -min, min)
library(dplyr)
library(purrr)
df %>%
mutate(min = select(., -e) %>%
reduce(pmin))
# A tibble: 5 x 5
# a b d e min
# <int> <int> <int> <int> <int>
#1 1 6 11 16 1
#2 2 7 12 17 2
#3 3 8 13 18 3
#4 4 9 14 19 4
#5 5 10 15 20 5
df %>%
mutate(min = pmin(!!! syms(names(.)[-4])))
# A tibble: 5 x 5
# a b d e min
# <int> <int> <int> <int> <int>
#1 1 6 11 16 1
#2 2 7 12 17 2
#3 3 8 13 18 3
#4 4 9 14 19 4
#5 5 10 15 20 5