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



该函数需要计数数字和使用频率(输入 - 向量,输出 - 矩阵(。(我知道,我怎样才能更容易地做到这一点,但我想了解错误(。 问题是函数忽略向量中的 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

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

问题出在您的逻辑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)会在更短的时间内做同样的事情,错误更少:)

您正在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))(

最新更新