#r #apply #lapply
#r #применить #lapply
Вопрос:
Использование lapply
и apply
функций для проверки идентичных значений дает противоречивые результаты.
Я делаю следующее:
test <- read.table(text="
V6 V7 V8
1 109 109 109
2 199 199 199
3 198 198 198
4 199 199 199
5 198 198 198
6 199 199 199", header=T)
for (i in 1:nrow(test)){
print(identical(test[1, 1],
test[1, 2],
test[1, 3]))
}
# [1] TRUE
# [1] TRUE
# [1] TRUE
# [1] TRUE
# [1] TRUE
# [1] TRUE
do.call("rbind", lapply(1:nrow(test),
function(x){
identical(test[x, 1],
test[x, 2],
test[x, 3])
}))
# [,1]
# [1,] TRUE
# [2,] TRUE
# [3,] TRUE
# [4,] TRUE
# [5,] TRUE
# [6,] TRUE
apply(test, 1, function(x){
identical(x[1], x[2], x[3])
})
# 1 2 3 4 5 6
# FALSE FALSE FALSE FALSE FALSE FALSE
Я действительно не понимаю этого несоответствия.
Комментарии:
1. Если бы вы использовали
identical(x[[1]], x[[2]], x[[3]])
со своимapply()
, вы бы получили TRUE
Ответ №1:
Это связано с именами столбцов ваших данных. Рассмотрим этот пример:
a <- t(matrix(c(1, 1, 1, 2, 2, 2), 3, 2))
apply(a, 1, function(x) identical(x[1], x[2], x[3]))
[1] TRUE TRUE
colnames(a) <- letters[1:3]
apply(a, 1, function(x) identical(x[1], x[2], x[3]))
[1] FALSE FALSE
Комментарии:
1. Другой способ подумать об этом заключается в том, что такие вещи, как
test[1,1]
, являются неназванными векторами одной длины. При использованииapply
объектыx[1]
и т.д. Сохраняют имена столбцов, каждое из которых отличается.2. и использование
x[[1]]
, похоже, приведет к удалению имени столбца.