R.为什么我的函数忽略1(并且正确地处理任何数字)?

Ром*_*рей 3 r function

该函数需要计数数和使用频率(输入 - 矢量,输出 - 矩阵).(我知道,我怎么能这样做更容易,但我想了解错误).问题是函数在向量中忽略1.

count_elements <- function(x) {

y <- sort(x)
m <- matrix(, nrow = 2, ncol = length(unique(x)))
a <- 1
for (i in 1:length(sort(x))) {
  if(is.element(y[i], m))  {
  } else { 
    (m[1, a] <- y[i]) & (m[2, a] <- sum(y == y[i])) & (a <- a+1) }
  } 
m
}
Run Code Online (Sandbox Code Playgroud)

示例输入和输出:

在向量中没有1

x <- c(2:10, 2, 3:7, -1)
count_elements(x)
#     [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
#[1,]   -1    2    3    4    5    6    7    8    9    10
#[2,]    1    2    2    2    2    2    2    1    1     1`
Run Code Online (Sandbox Code Playgroud)

在向量中有1

x <- c(0:10, 2, 3:7, -1)
count_elements(x)
#     [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11] [,12]
#[1,]   -1    0    2    3    4    5    6    7    8     9    10    NA
#[2,]    1    1    2    2    2    2    2    2    1     1     1    NA
Run Code Online (Sandbox Code Playgroud)

谢谢你,对不起我的英文:)

Dan*_*n Y 5

问题在于您的逻辑if测试.你问"是y[i]一个元素m?" 这将检查第一行和第二行m.所以使用你的第二个例子x,当你经历了两次循环时,m看起来像这样:

     [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11] [,12]
[1,]   -1    0   NA   NA   NA   NA   NA   NA   NA    NA    NA    NA
[2,]    1    1   NA   NA   NA   NA   NA   NA   NA    NA    NA    NA
Run Code Online (Sandbox Code Playgroud)

并且在循环的下一次迭代中,if为TRUE,因为第二行中有1.请注意,您恰好发现错误为1,但任何正数都可能出现相同的错误.例如,如果x = c(1, 1, 2, 3)你得到2的错误,因为当你到达循环中的2时你已经找到两个1.

我认为最简单的解决方法是将if语句更改为:

if(is.element(y[i], m[1,]))
Run Code Online (Sandbox Code Playgroud)

关于它们的价值的一些其他编码思路:

  • length(sort(x))是一样的length(x).不确定为什么你需要"排序"
  • 如果if语句的计算结果为TRUE,则没有任何反应,因此似乎不需要任何if/else业务
  • 我从未见过这种括号 - &符号编码风格,例如:() & () & ().换行符或分号是在R中分隔命令的典型方法
  • 即使你提到你是故意这么做的,但值得注意的是,table(x)它将完全相同的事情,在更短的时间内和更少的错误:​​)