如何使用带参数的函数来应用lapply()

问题描述 投票:0回答:1

我有这个df:

set.seed(20)
df <- data.frame(X1 = sample(c(1:10,NA), 10, replace=TRUE),
                X2 = sample(c(1:10,NA), 10, replace=TRUE),
                X3 = sample(c(1:10,NA), 10, replace=TRUE),
                stringsAsFactors = FALSE)

> df
   X1 X2 X3
1  10  8  6
2   9  9  1
3   4  1  5
4   6  9  1
5  NA  3  3
6  NA  5  1
7   2  4 10
8   1  2 NA
9   4  4  1
10  5 10  8

在哪里我可以轻松使用这个功能:

lapply(df, sum)
df %>% lapply(., sum)
df %>% lapply(., as.numeric)

但是,如果我想把na.rm=TRUE论证放在sum()是不可能的。我一直在寻找答案,似乎唯一的解决方案是在lapply()中定义函数sum,如:

lapply(df, function() {})

是不是真的不可能将函数FUN的参数放在lapply中?此外,我正在努力解决的问题是当我想使用管道运算符应用需要数据的函数(例如,sum(data, na.rm=TRUE))时,我无法将数据提供给函数:

df %>% lapply(., sum(, na.rm=TRUE)) # It needs the sum argument.
df %>% lapply(., sum(., na.rm=TRUE)) # but I'm not looking to sum the whole df
r apply data-manipulation
1个回答
1
投票

我想你想在这里总结一下df的列。你可以这样做:

set.seed(seed = 20)

df <- data.frame(X1 = sample(c(1:10, NA), 10, replace = TRUE),
                 X2 = sample(c(1:10, NA), 10, replace = TRUE),
                 X3 = sample(c(1:10, NA), 10, replace = TRUE))

df
#>    X1 X2 X3
#> 1  10  8  6
#> 2   9  9  1
#> 3   4  1  5
#> 4   6  9  1
#> 5  NA  3  3
#> 6  NA  5  1
#> 7   2  4 10
#> 8   1  2 NA
#> 9   4  4  1
#> 10  5 10  8

lapply(df, sum, na.rm = TRUE)
#> $X1
#> [1] 41
#> 
#> $X2
#> [1] 55
#> 
#> $X3
#> [1] 36

reprex package创建于2019-04-02(v0.2.1)

另一种方法是使用colSums(df, na.rm = TRUE)

© www.soinside.com 2019 - 2024. All rights reserved.