该功能需要计数和使用频率(输入-向量,输出-矩阵)。 (我知道,我如何可以更轻松地完成此操作,但我想了解该错误)。 问题在于该函数在向量中忽略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
谢谢您,我的英语很抱歉:)
答案 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>