#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))))