在为程序员阅读R时,我看到了这个功能
oddcount <- function(x) {
k <- 0
for (n in x) {
if (n %% 2 == 1) k <- k+1
}
return(k)
}
Run Code Online (Sandbox Code Playgroud)
我更喜欢用更简单的风格(即在lisp中)编写它
(defn odd-count [xs]
(count (filter odd? xs)))
Run Code Online (Sandbox Code Playgroud)
我看到函数长度相当于count,我可以写奇数?所以有内置的map/filter/remove类型函数吗?
Edw*_*ard 12
在R中,当您使用向量时,人们通常更喜欢一次处理整个向量而不是循环遍历它(例如,参见本讨论).
从某种意义上说,R确实具有"内置"过滤器和减少功能:您可以选择向量子集的方式.它们在R中非常方便,有几种方法可以解决它 - 我会告诉你一些,但是如果你读到R并且在这样的网站上查看其他人的代码,你会得到更多.我也会考虑在看?which和?'[',它具有更多的例子,比我在这里做.
第一种方法是选择您想要的元素.如果您知道所需元素的索引,则可以使用此方法:
x <- letters[1:10]
> x
[1] "a" "b" "c" "d" "e" "f" "g" "h" "i" "j"
Run Code Online (Sandbox Code Playgroud)
如果我们只想要前五个字母,我们可以写:
x[1:5]
x[c(1,2,3,4,5)] # a more explicit version of the above
Run Code Online (Sandbox Code Playgroud)
您还可以使用减号选择不需要的元素,例如:
x[-(6:10)]
Run Code Online (Sandbox Code Playgroud)
选择元素的另一种方法是使用布尔向量:
x <- 1:5
selection <- c(FALSE, TRUE, FALSE, TRUE, FALSE)
x[selection] # only the second and fourth elements will remain
Run Code Online (Sandbox Code Playgroud)
这很重要,因为我们可以通过在向比较函数中放置一个向量来创建这样的向量:
selection <- (x > 3)
> selection
[1] FALSE FALSE FALSE TRUE TRUE
x[selection] # select all elements of x greater than 3
x[x > 3] # a shorthand version of the above
Run Code Online (Sandbox Code Playgroud)
再一次,我们可以选择与我们使用的比较相反(注意,因为它是布尔值,我们使用!而不是-):
x[!(x > 3)] # select all elements less than or equal to 3
Run Code Online (Sandbox Code Playgroud)
如果要进行矢量比较,则应考虑该%in%函数.例如:
x <- letters[1:10]
> x %in% c("d", "p", "e", "f", "y")
[1] FALSE FALSE FALSE TRUE TRUE TRUE FALSE FALSE FALSE FALSE
# Select all elements of x that are also "d", "p", "e", "f", or "y"
x[x %in% c("d", "p", "e", "f", "y")]
# And to select everything not in that vector:
x[!(x %in% c("d", "p", "e", "f", "y"))]
Run Code Online (Sandbox Code Playgroud)
以上只是几个例子; 我肯定会推荐这些文档.我知道这是一个很长的帖子,你已经接受了答案,但这种事情是非常重要的,理解它将为你节省很多时间和痛苦,如果你是R的新手,所以我想我和你分享了几种方法.
Pau*_*tra 11
更R的方法是避免for循环,并使用矢量化:
oddcount <- function(x) {
sum(x %% 2)
}
Run Code Online (Sandbox Code Playgroud)
x和2 之间的比较输出一个矢量,因为x它本身就是一个矢量.Sum比计算向量的总和,其中TRUE等于1且FALSE等于零.这样,函数计算向量中的奇数个数.
这已经导致更简单的语法,尽管对于非向量化的人来说,for循环往往更容易阅读.我非常喜欢矢量化语法,因为它更短.我宁愿使用更具描述性的名称x,例如number_vector.
| 归档时间: |
|
| 查看次数: |
1146 次 |
| 最近记录: |