一个基本R函数
在阅读R for Programmer时,我看到了这个函数一个基本R函数,r,R,在阅读R for Programmer时,我看到了这个函数 oddcount <- function(x) { k <- 0 for (n in x) { if (n %% 2 == 1) k <- k+1 } return(k) } 我看到函数长度等于count,我能写奇数吗?有内置的map/filter/remove类型函数吗?你应该看看这个库,它包括map、filter、reduce等。更简单的方法是避免for循环,并使用矢量化: oddcoun
oddcount <- function(x) {
k <- 0
for (n in x) {
if (n %% 2 == 1) k <- k+1
}
return(k)
}
我看到函数长度等于count,我能写奇数吗?有内置的map/filter/remove类型函数吗?你应该看看这个库,它包括
map
、filter
、reduce
等。更简单的方法是避免for
循环,并使用矢量化:
oddcount <- function(x) {
sum(x %% 2)
}
oddcount在R中,当您处理向量时,人们通常喜欢一次处理整个向量,而不是循环处理它(例如,请参见讨论)
从某种意义上说,R确实具有“内置”过滤和缩减功能:即选择向量子集的方式。它们在R中非常方便,并且有一些方法可以实现这一点——我将向您展示一些方法,但是如果您阅读关于R的内容,并在类似这样的网站上查看其他人的代码,您会学到更多。我也会考虑查看<代码>?< < /代码>和<代码>?[’< /代码>,这里有比我更多的例子。
第一种方法是简单地选择所需的元素。如果您知道所需元素的索引,则可以使用此方法:
x <- letters[1:10]
> x
[1] "a" "b" "c" "d" "e" "f" "g" "h" "i" "j"
还可以使用减号选择不需要的元素,例如:
x[-(6:10)]
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"))]
选择元素的另一种方法是使用布尔向量:
x <- 1:5
selection <- c(FALSE, TRUE, FALSE, TRUE, FALSE)
x[selection] # only the second and fourth elements will remain
如果你想做向量比较,你应该考虑%<>代码>函数中的<代码> %。例如:
x[-(6:10)]
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"))]
x%,单位为%c(“d”、“p”、“e”、“f”、“y”)
[1] 假假假真假假假假假假假
#选择x的所有元素,这些元素也是“d”、“p”、“e”、“f”或“y”
x[x%以%c(“d”、“p”、“e”、“f”、“y”)表示]
#要选择不在该向量中的所有内容:
x[!(x%以%c(“d”、“p”、“e”、“f”、“y”)表示)
以上只是几个例子;我肯定会推荐这些文档。我知道在你接受答案后这是一篇很长的文章,但这类事情非常重要,如果你是R新手,了解它将为你在未来节省大量时间和痛苦,所以我想我会分享一些方法与你一起。谢谢,长度(Filter(odd_p,xs))似乎能胜任这项工作,根据上一个答案,我似乎问了一个错误的问题:)使用funprog
,没有什么错,但使用标准R,你可以得到同样的代码简短度。这是一个好的观点,@Paul。试图强迫使用一种范式(矢量化)的语言进入另一个范例(函数)通常会导致不必要的冗长代码。谢谢,这肯定是有帮助的。在这种情况下,它可能会更短,您不需要==1
,因为%%
将只返回0和1。使用求和(x%%2)
。这可能会快一点,因为您没有生成逻辑并将其转换回数字。有些人可能会发现较长的版本更具可读性(如果要将此扩展到查找不是2的倍数的数字,则需要较长的版本)。
x[!(x > 3)] # select all elements less than or equal to 3
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"))]