2
x<- read.table('d:\\2.csv', sep=';', header=TRUE)
x <- log(x) #логарифмируем 
x <- x[-1] #отбросим колонку с именами игроков
x <- apply(x, 2, diff) #считаем разницу между последовательными элементами
x <- t(x) #транспонируем таблицу
kmeans(x, 5, 1000000) #будем разбивать на 25 кластеров, максимум 1000000 иттераций

Читаю подготовленный файл - все читается без проблем.

Далее хочу сделать простое логарифмирование x<-log(x) и вылетает ошибка

Error in Math.data.frame(x) :

non-numeric variable(s) in data frame: X.stat1.stat2.stat4.

stat1 и т.д. - это имена колонок в файле.

Как мне привести данные исходные в порядок, чтобы не было таких ошибок? Сама ссылка на файл

1 Answers1

2

В общем случае, если числа являются символьными векторами, можно привести значения к числовым с помощью as.numeric:

> values <- c("9", "100")
> df <- data.frame(values)
> log(as.numeric(df$values))
[1] 0.6931472 0.0000000

В вашем конкретном случае можно попробовать так:

x <- read.table(file, sep=';', header=TRUE)
x <- x[-1] #отбросим колонку с именами игроков
x <- log(x) #логарифмируем 
x <- apply(x, 2, diff) #считаем разницу между последовательными элементами
x <- t(x) #транспонируем таблицу
is.na(x) <- do.call(cbind,lapply(x, is.infinite)) # Заменить все Inf на NA
is.na(x) <- do.call(cbind,lapply(x, is.nan)) # Заменить все NaN на NA
x <- na.omit(x) # Удалить строки, содержащие NA
kmeans(x, 5, 1000000) # будем разбивать на 25 кластеров, максимум 1000000 итераций
  • Спасибо за ответ но у меня таблица данных, 127 столбцов и 547 строк. и данные там вида real – Vladimr Vladimirovoch Oct 11 '18 at 11:19
  • @VladimrVladimirovoch Приведите пример с проблемными строками в тексте вопроса. Я тестировал и с таблицей данных, но только с целыми числами. Только что попробовал с числами типа 3.45 и 6.44, тоже работает. – Wiktor Stribiżew Oct 11 '18 at 11:20
  • Подправил вопрос, теперь полная картина – Vladimr Vladimirovoch Oct 11 '18 at 11:34
  • Что если x <- x[-1] поменять местами с x <- log(x)? – Wiktor Stribiżew Oct 11 '18 at 11:50
  • а логика не нарушится, просто я крайне новичек в R – Vladimr Vladimirovoch Oct 11 '18 at 11:55
  • @VladimrVladimirovoch Вы ведь и так отбросите ненужные данные, а они мешают логарифмированию. Это лучшее решение в данном случае, по-моему. – Wiktor Stribiżew Oct 11 '18 at 11:56
  • Спасибо, а вот после этой строки возникает ошибка. > kmeans(x, 25, 1000000) #будем разбивать на 25 кластеров, максимум 1000000 Error in do_one(nmeth) : NA/NaN/Inf in foreign function call (arg 1) – Vladimr Vladimirovoch Oct 11 '18 at 11:58
  • @VladimrVladimirovoch Это результат логарифмирования. Что вы собираетесь делать с этими значениями? Удалить целую строку, если в одной из ячеек NaN, NA или Inf? – Wiktor Stribiżew Oct 11 '18 at 12:15
  • я пытаюсь сделать вот это в конечном итоге kmeans(x, 25, 1000000) #будем разбивать на 25 кластеров, максимум 1000000 иттераций, это сделать мне мешает как раз не числовые значения, как мне убрать их – Vladimr Vladimirovoch Oct 11 '18 at 12:22
  • @VladimrVladimirovoch Я обновил ответ. – Wiktor Stribiżew Oct 11 '18 at 13:36
  • Спасибо заработало, вопрос, я получил кластерный анализ,так как мы отбросили колонку с именем, я вижу кластеры, и сколько в них элементов, а вопрос, как мне узнать имена этих элементов, – Vladimr Vladimirovoch Oct 11 '18 at 13:51
  • @VladimrVladimirovoch Это уже, кажется, не относится напрямую к этому вопросу. Я вижу, что матрица/таблица/датафрейм для функции kmeans должна содержать только числовые значения. Не знаю, как вы хотите сохранить данные об игроках. – Wiktor Stribiżew Oct 11 '18 at 17:22