Это должен быть основной вопрос, и может быть много дубликатов, но я не могу найти их, поэтому, пожалуйста, несите меня и указывайте мне в нужное место. Благодаря!привязка фреймов данных с различными типами данных
У меня есть кадр данных, который содержит целые числа с возможными NA и отсутствующие значения. Я вычисляю ряд строк (установка NA для нуля) и значение столбца (пропуск NA). Затем я хотел бы создать кадр данных (или таблицу), содержащий целые числа, вместе со строками и средствами столбца. Вот кадр пример данных:
df <- data.frame(
'ID' = c("123A","456B","789C","1011","1213")
, 'Test 1' = c(55,65,60,NA,50)
, 'Test 2' = c(45,48,50,52,55)
, 'Test 3' = c(51,49,55,69,61)
)
df
ID Test.1 Test.2 Test.3
1 123A 55 45 51
2 456B 65 48 49
3 789C 60 50 55
4 1011 NA 52 69
5 1213 50 55 61
Вот функция, которая вычисляет столбец означает пропуск NAs:
colMean <- function(df, na.rm = TRUE) {
if (na.rm) {
n <- rowSums(!is.na(df))
} else {
n <- ncol(df)
}
colMean <- colMeans(df, na.rm=na.rm)
return(rbind(df, "colMean" = colMean))
}
Вот функция, которая вычисляет строки означает установление Nas к нулю:
rowMeanz <- function(df) {
df[is.na(df)] <- 0
return(cbind(df, "rowMean" = rowMeans(df)))
}
Одна из проблем заключается в том, что rbind изменяет тип данных в том смысле, что целые числа преобразуются в поплавки (или, как представляется,) в столбце с надписью «Test.1»:
colMean(df[sapply(df, is.numeric)])
Test.1 Test.2 Test.3
1 55.0 45 51
2 65.0 48 49
3 60.0 50 55
4 NA 52 69
5 50.0 55 61
colMean 57.5 50 57
В вашем ответе я был бы очень благодарен за объяснение, почему в этом случае влияет только первый столбец. Связано ли это с наличием NA в столбце?
я не наблюдал ту же проблему с другой функции, на основе cbind:
rowMeanz(df[sapply(df, is.numeric)])
Test.1 Test.2 Test.3 rowMean
1 55 45 51 50.33333
2 65 48 49 54.00000
3 60 50 55 55.00000
4 0 52 69 40.33333
5 50 55 61 55.33333
В конце концов, я хотел бы получить dataframe или таблицу, которая будет выглядеть следующим образом:
ID Test.1 Test.2 Test.3 rowMean
1 123A 55 45 51 50.33333
2 456B 65 48 49 54.00000
3 789C 60 50 55 55.00000
4 1011 NA 52 69 40.33333
5 1213 50 55 61 55.33333
6 colMean 57.5 50 57
Буду признателен, если вы покажете мне, как это сделать не слишком много. Я открыт для ответов на базовые R, а также ответы на основе пакетов. Эти вычисления будут сделаны онлайн в блестящем приложении, поэтому я бы особенно хотел видеть эффективные методы. Большое спасибо!
'57.5' не является целым числом, поэтому ни один из элементов в этом столбце не может быть сохранен как целое. – joran
Хорошо, я вижу, что теперь, ничего общего с НС, спасибо. Итак, что бы вы предложили «отображать» целые числа в виде целых чисел, а остальное - как float? Моя конечная цель - отобразить данные в виде таблицы. Благодарю. – PatrickT