#r
Вопрос:
После расчета средней стоимости по городу за 1900-1910 годы мне нужно удалить все города, в которых отсутствуют данные за период с 1860 по 1863 год. Вот данные за этот промежуток времени…
city cost1860 cost1861 cost1862 cost1863 cost1864 1 Boston NA NA NA NA NA 2 Los Angeles 1.77643659 3.516253 1.683492 3.573637296 4.4076780 3 Detroit NA NA NA NA NA 4 New York City NA NA NA NA NA 5 Chicago 32.87500913 39.785973 35.471498 24.683812800 19.5488509 6 Memphis NA NA NA NA NA 7 Seattle NA NA NA NA NA 8 St. Louis -0.01007441 4.659959 NA 0.005722915 NA 9 Boulder NA NA NA NA NA 10 Boise NA NA NA NA NA
Теперь в отдельных столбцах также есть данные за следующие годы, но мне нужно найти способ удалить города, в которых есть какие-либо значения NA между 1860 и 1863 годами, без удаления всех данных за следующие годы. Итак, как только это будет сделано, у меня должны быть только города с данными за период с 1860 по 1863 год (а также данные за последующие годы, которые могут иметь значения NA).
Мне удалось удалить города с отсутствующими данными в период с 1860 по 1863 год, но я не могу понять, как это сделать, не удалив также все данные за последующие годы. Это мой код для этого…
na.exclude(mydata[, 2:5]) mydata_1860_1863 lt;- na.exclude(mydata[, 2:5])
Кто-нибудь знает, как я мог бы удалить недостающие данные по городам между 1860 и 1863 годами, сохранив при этом данные за последующие годы?
Ответ №1:
Трудно удалить строки, но сохранить столбцы. Вместо удаления, почему бы не отметить те строки, в которых отсутствуют данные за 1860-1863 годы, чтобы вы могли отфильтровать их позже?
Например:
library(dplyr) mydata lt;- mydata %gt;% mutate(is_missing = ifelse(is.na(rowSums(.[, 2:5])), 1, 0))
Результат:
city cost1860 cost1861 cost1862 cost1863 cost1864 is_missing 1 Boston NA NA NA NA NA 1 2 Los Angeles 1.77643659 3.516253 1.683492 3.573637296 4.407678 0 3 Detroit NA NA NA NA NA 1 4 New York City NA NA NA NA NA 1 5 Chicago 32.87500913 39.785973 35.471498 24.683812800 19.548851 0 6 Memphis NA NA NA NA NA 1 7 Seattle NA NA NA NA NA 1 8 St. Louis -0.01007441 4.659959 NA 0.005722915 NA 1 9 Boulder NA NA NA NA NA 1 10 Boise NA NA NA NA NA 1
Ответ №2:
Здесь решение, основанное на data.table
:
library(data.table) dt lt;- data.table::data.table(city = c("Boston","Los Angeles", "Detroit","New York City","Chicago","Memphis","Seattle", "St. Louis","Boulder","Boise"), cost1860 = c(NA,1.77643659,NA,NA, 32.87500913,NA,NA,-0.01007441,NA,NA), cost1861 = c(NA,3.516253,NA,NA,39.785973, NA,NA,4.659959,NA,NA), cost1862 = c(NA, 1.683492, NA, NA, 35.471498, NA, NA, NA, NA, NA), cost1863 = c(NA,3.573637296,NA,NA, 24.6838128,NA,NA,0.005722915,NA,NA), cost1864 = c(NA, 4.407678, NA, NA, 19.5488509, NA, NA, NA, NA, NA) ) dt[dt[,!is.na(rowSums(.SD)),.SDcols=-c(1,6)]] #gt; city cost1860 cost1861 cost1862 cost1863 cost1864 #gt; 1: Los Angeles 1.776437 3.516253 1.683492 3.573637 4.407678 #gt; 2: Chicago 32.875009 39.785973 35.471498 24.683813 19.548851
Теперь, tidyverse
подход:
library(tidyverse) df lt;- data.frame(stringsAsFactors = FALSE, city = c("Boston", "Los Angeles","Detroit","New York City","Chicago", "Memphis","Seattle","St. Louis","Boulder","Boise"), cost1860 = c(NA,1.77643659,NA, NA,32.87500913,NA,NA,-0.01007441,NA,NA), cost1861 = c(NA,3.516253,NA, NA,39.785973,NA,NA,4.659959,NA,NA), cost1862 = c(NA,1.683492,NA, NA,35.471498,NA,NA,NA,NA,NA), cost1863 = c(NA,3.573637296,NA, NA,24.6838128,NA,NA,0.005722915,NA,NA), cost1864 = c(NA,4.407678,NA, NA,19.5488509,NA,NA,NA,NA,NA)) df %gt;% filter(across(2:5, ~ !is.na(.x))) #gt; city cost1860 cost1861 cost1862 cost1863 cost1864 #gt; 1 Los Angeles 1.776437 3.516253 1.683492 3.573637 4.407678 #gt; 2 Chicago 32.875009 39.785973 35.471498 24.683813 19.548851
Ответ №3:
Использование is.na()
в таблицах i
данных. dt[I,j,by]
dt[!(is.na(cost1861) | is.na(cost1862) | is.na(cost1863))]