Фрейм данных имеет NAs вместо значений

#r #dataframe

#r #фрейм данных

Вопрос:

У меня есть фрейм данных, загруженный из файла Excel. Это похоже на это:

 Gender Country Effect Use Products  Male UK 1 2 7 Female USA 2 4 6 Male Russia 3 5 2 Female China 4 2 3 Male China 3 1 6 Female USA 2 5 2 Male UK 3 3 1 Female Russia 4 1 7  

Я хочу рассчитать среднее значение по стране, как в примере ниже (без учета пола).:

 Country Effect Use Products  UK 3 2 7 USA 2 4 4 Russia 3 5 5 China 4 2 4  

Я использовал аналогичный код для выполнения этой операции (где «d» — имя базы данных).:

 country_avg lt;- aggregate(d[, 3:5], list(d
 #r #dataframe

 #r #фрейм данных

Вопрос:

У меня есть фрейм данных, загруженный из файла Excel. Это похоже на это:
 Gender Country Effect Use Products  Male UK 1 2 7 Female USA 2 4 6 Male Russia 3 5 2 Female China 4 2 3 Male China 3 1 6 Female USA 2 5 2 Male UK 3 3 1 Female Russia 4 1 7  

Я хочу рассчитать среднее значение по стране, как в примере ниже (без учета пола).:

 Country Effect Use Products  UK 3 2 7 USA 2 4 4 Russia 3 5 5 China 4 2 4  

Я использовал аналогичный код для выполнения этой операции (где "d" - имя базы данных).:

Country `), mean)

Однако вместо желаемого результата исходящая база данных выглядит следующим образом:

 Group1 Effect Use Products  UK NA NA NA USA NA NA NA Russia NA NA NA China NA NA NA  

Числа в моем фрейме данных не идентифицируются как числовые значения (я проверил это с помощью is.numeric). Более того, R возвращает множество следующих предупреждающих сообщений:

 1: In mean.default(X[[i]], ...) :  argument is not numeric or logical: returning NA  

Пожалуйста, дайте мне знать, как я могу решить эту проблему.

Ответ №1:

Удалите обратную кавычку, так как она также содержит пробел в качестве суффикса, которого может не быть в имени исходного столбца данных.

 aggregate(d[, 3:5], list(d$Country ), FUN = mean)  

Или используйте метод формулы, который дает имена, как в исходных данных для столбца группировки

 aggregate(.~ Country, d[-1], FUN = mean)  

данные

 d lt;- structure(list(Gender = c("Male", "Female", "Male", "Female",  "Male", "Female", "Male", "Female"), Country = c("UK", "USA",  "Russia", "China", "China", "USA", "UK", "Russia"), Effect = c(1L,  2L, 3L, 4L, 3L, 2L, 3L, 4L), Use = c(2L, 4L, 5L, 2L, 1L, 5L,  3L, 1L), Products = c(7L, 6L, 2L, 3L, 6L, 2L, 1L, 7L)),  class = "data.frame", row.names = c(NA,  -8L))  

Комментарии:

1. К сожалению, это не работает. Мне кажется, что числа в моем фрейме данных не идентифицируются как числовые. Есть ли способ преобразовать их в числовые значения?

2. @SSG_08 Возможно, в ваших исходных данных есть некоторые нечисловые элементы, которые преобразуют их в символы. Попробуйте d[, 3:5] lt;- lapply(d[,3:5], function(x) as.numeric(as.character(x))) , а затем используйте код

3. Спасибо вам за вашу помощь! И все же, к сожалению, результат все тот же. Но, по-видимому, я обнаружил, что R идентифицирует номера в базе данных как список. Однако я не уверен, как преобразовать список в числовые значения.

4. @SSG_08 Структура ваших данных неясна. Возможно, используйте dput(d) , чтобы показать воспроизводимый пример. В противном случае мы считаем, что это обычный набор данных, основанный на том, что вы показали

5. @SSG_08 Может быть, вам нужно d[, 3:5] lt;- lapply(d[, 3:5], function(x) as.numeric(as.character(unlist(x))))