Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ember.js/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在某些R函数中隐式调用列_R_Tidyverse - Fatal编程技术网

如何在某些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>

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> <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