R.为什么我的函数忽略1(并正确使用任何数字)?

时间:2018-08-22 22:57:56

标签: 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
}

输入和输出示例:

向量中不包含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`

向量中带有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

谢谢您,我的英语很抱歉:)

2 个答案:

答案 0 :(得分: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

,并且在循环的下一次迭代中,if为TRUE,因为第二行中有1。请注意,您只是偶然发现带有1的错误,但是任何正数都可能发生相同的错误。例如,如果x = c(1, 1, 2, 3)会导致2错误,因为在循环中找到2时发现了两个1。

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

if(is.element(y[i], m[1,]))

有关其价值的其他一些编码思想:

  • length(sort(x))length(x)相同。不确定为什么需要“排序”
  • 如果if语句的计算结果为TRUE,则不会发生任何事情,因此似乎不需要任何if / else业务
  • 我从未见过这种括号和号的编码样式,例如:() & () & ()。换行符或分号是R中分隔命令的典型方法。
  • 尽管您提到自己是有意地这样做的,但值得注意的是table(x)会做完全一样的事情,所花费的时间更少,错误更少:)

答案 1 :(得分:1)

您正在logical表达式中进行作业。 &运算符的意思是AND,它通常不像您所使用的那样将表达式绑定在一起。

您可以通过仅索引x的唯一元素来简化代码。这样就消除了a的麻烦,并且省去了检查是否包含元素的麻烦。

count_elements_new <- function(x) {

  y <- sort(x)
  u <- unique(y)
  m <- matrix(, nrow = 2, ncol = length(u))
  for (i in 1:length(u)) {
    m[1, i] <- u[i]
    m[2, i] <- sum(y == u[i])
  }
  m
}

(这消除了if(),但是您也可以在!语句中使用if()并删除else,如下所示:if(!is.element(y[i], m)))< / p>