r - 如何使用 R 语言编写一个仅从整数列表中返回奇数的函数?
问题描述
如何使用 R 语言编写一个仅从整数列表中返回奇数的函数?到目前为止我试过这个
function3 <- function(x){
x<-as.integer(x)
if (x %% 2 ==1) {
return(x)
}
}
但它不适用于列表或向量,我真的不知道如何更改我的代码,因为“if”会抱怨条件 >“has length > 1”,并且只会使用第一个元素
解决方案
justodd <- function(x) x[ x %% 2 == 1 ]
justodd(4:20)
# [1] 5 7 9 11 13 15 17 19
解释:
索引在
?Extract
(也在?[
)中进行了描述,您会看到它需要一个integer
(或可整数化的numeric
)列表或logical
. 如果是前者,数字需要在向量的长度内;如果是后者,那么它应该与原始向量的长度相同。例如,x <- 4:20 x[c(3,5,1)] # [1] 6 8 4 x[c(F,F,T,F,T,F,F,F,T,F,F,F,F,F,F,F,F)] # [1] 6 8 12
所以我们的
[
-insides 看起来像x %% 2 == 1 # [1] FALSE TRUE FALSE TRUE FALSE TRUE FALSE TRUE FALSE TRUE FALSE TRUE # [13] FALSE TRUE FALSE TRUE FALSE
x
然后我们根据该返回值索引原始向量
更新
您提到它不能与 alist
作为参数一起使用,这表明一种速度较慢但适用于向量和列表的替代方法。
justodd2 <- function(x) Filter(function(a) a %% 2 == 1, x)
vec <- 4:20
lst <- as.list(4:20)
str(vec)
# int [1:17] 4 5 6 7 8 9 10 11 12 13 ...
str(lst)
# List of 17
# $ : int 4
# $ : int 5
# $ : int 6
# $ : int 7
# $ : int 8
# $ : int 9
# $ : int 10
# $ : int 11
# $ : int 12
# $ : int 13
# $ : int 14
# $ : int 15
# $ : int 16
# $ : int 17
# $ : int 18
# $ : int 19
# $ : int 20
justodd2(vec)
# [1] 5 7 9 11 13 15 17 19
justodd2(lst)
# [[1]]
# [1] 5
# [[2]]
# [1] 7
# [[3]]
# [1] 9
# [[4]]
# [1] 11
# [[5]]
# [1] 13
# [[6]]
# [1] 15
# [[7]]
# [1] 17
# [[8]]
# [1] 19
性能对比:
microbenchmark::microbenchmark(
a = justodd(vec),
b = justodd2(vec),
c = justodd2(lst)
)
# Unit: nanoseconds
# expr min lq mean median uq max neval
# a 800 1000 26642 1100 1200 2537700 100
# b 12100 12500 24154 12700 13150 1055600 100
# c 12100 12300 23777 12500 12800 1022900 100
(忽略 的高mean
和max
值microbenchmark
,它们通常受到 R 内部垃圾收集的影响。如果你不知道那是什么......只需按下[I believe]
按钮或谷歌搜索。)
所以最终,如果你总是在处理向量,那么我建议第一个justodd
解决方案,否则justodd2
更安全(justodd(lst)
失败)。
推荐阅读
- python - python中的平面序列可以有'in'运算符吗?
- java - Android Paging Library 如何知道加载更多数据?
- sql - XML 到 SQL 问题 - SQL Server
- javascript - Cannon.js - 如何为 HingeConstraint 设置旋转限制?
- asp.net-core - EF Core2.0 dbvalidation 错误未显示所有错误
- java - Tomcat 8、Hibernate 5.2、MSSQL、HikariCP 标准搜索返回 Null
- python - Filenotfounderror 文件 b'.csv' 不存在
- java - 文件导出到 jar 后给出空指针
- python - Pygame 在空闲但不在 pycharm 上工作
- r - R完全互连的加权图