R.为什么我的函数忽略1(并正确处理任何数字)?
该函数需要计数和使用频率(输入向量、输出矩阵)。(我知道,我如何能做得更容易,但我想了解错误)。 问题是函数忽略了向量中的1R.为什么我的函数忽略1(并正确处理任何数字)?,r,function,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 {
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
}
count\u elements问题在于逻辑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
为真,因为第二行中有一个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)
将以更少的时间和更少的错误完成完全相同的操作:)
您正在逻辑表达式中执行作业。和
操作符的意思是和
,它通常不用于像您现在这样将表达式绑定在一起
通过仅对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
}
count\u elements\u new
if(is.element(y[i], m[1,]))
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
}