Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/74.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
一个基本R函数_R - Fatal编程技术网

一个基本R函数

一个基本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

在阅读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
循环,并使用矢量化:

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"))]