R:带有列表的不同函数

R: distinct function with a list

我想将 distinct 函数应用于许多变量。所以假设我有数据框……

df <- data.frame(
  id = c(1,1,1,2,3,3),
  `sitting position` = c("A","B","A","A","B","B"),
  `movement haed` = c("left", "left", "right", "right", "left", "left"),
  `colesterol level` = c(50, 30, 45, 80, 90, 130),
  check.names = FALSE)

…现在我将这些变量放在一个列表中,我想为其应用不同的函数(我的数据框中有更多变量)。假设这是列表:

columns <- dput(colnames(df))[-3]

Output:
c("id", "sitting position", "colesterol level"
)

有没有办法直接将 columnsdistinct 函数一起应用(类似于 distinct(df, columns),不幸的是,它不起作用)?或者我总是必须一个一个地输入变量,比如

df_new <- distinct(df, id, `sitting position`, `colesterol level`)

Output:
df_new
  id sitting position colesterol level
1  1                A               50
2  1                B               30
3  1                A               45
4  2                A               80
5  3                B               90
6  3                B              130
> 

这确实有效,但会花费太多时间。如果我直接应用 columns,我总是会收到一条错误消息,我真的不知道如何解决这个问题。

非常感谢您的帮助!

我们可以在这里利用tidyversedistinct_all。此函数的优点在于您可以使用 .funs 参数进一步指定应包含哪些变量。因为 *_allsuperseded,所以我包含了一个 across 版本。

library(dplyr)

# using the columns variable
df %>%
  distinct(across(all_of(columns)))

  id sitting position colesterol level
1  1                A               50
2  1                B               30
3  1                A               45
4  2                A               80
5  3                B               90
6  3                B              130

dplyr::distinct_all(df)

#or

df %>%
  distinct(across(.cols = everything()))

  id sitting position movement haed colesterol level
1  1                A          left               50
2  1                B          left               30
3  1                A         right               45
4  2                A         right               80
5  3                B          left               90
6  3                B          left              130

或者如果你想select某些变量

df %>%
  distinct_all() %>%
  select(id, `sitting position`, `colesterol level`)
  id sitting position colesterol level
1  1                A               50
2  1                B               30
3  1                A               45
4  2                A               80
5  3                B               90
6  3                B              130