2015-08-27 4 views
0

У меня есть следующий набор данных:Удаление строк на основе значений определенных столбцов

ID <- c(1,2,3,4,5,6,7,8,9,10) 
x1 <- c(1.3, 1.4, NA, NA, 1.4, -1.0, NA, 0.3, 0.7, NA) 
x2 <- c(4.6, 2.6, NA, 4.3, NA, 5.6, NA, 3.7, 5.3, NA) 
x3 <- c(-0.9, 5.6, NA, -1.3, NA, -3.4, NA, 0.3, -2.6, NA) 
x4 <- c(10.5, NA, NA, 0.1, -0.5, NA, NA, 21.5, 2.0, NA) 
x5 <- c(9.5, -5.0, NA, -0.7, 3.6, 3.8, -7.8, 9.8, -12.2, NA) 
x6 <- c(-10.3, NA, -4.4, NA, 12.2, NA, NA, -4.1, 3.3, NA) 

alldata <- data.frame(ID,x1,x2,x3,x4,x5,x6) 

ID x1 x2 x3 x4 x5 x6 
1 1.3 4.6 -0.9 10.5 9.5 -10.3 
2 1.4 2.6 5.6 "NA" -5.0 "NA" 
3 "NA" "NA" "NA" "NA" "NA" -4.4 
4 "NA" 4.3 -1.3 0.1 -0.7 "NA" 
5 1.4 "NA" "NA" -0.5 3.6 12.2 
6 -1.0 5.6 -3.4 "NA" 3.8 "NA" 
7 "NA" "NA" "NA" "NA" -7.8 "NA" 
8 0.3 3.7 0.3 21.5 9.8 -4.1 
9 0.7 5.3 -2.6 2.0 -12.2 3.3 
10 "NA" "NA" "NA" "NA" "NA" "NA" 

Мне нужно удалить любую строку, если значения x1-Х5 ALL «NA», и я не уход имеет ли x6 значение или «NA».

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

ID x1 x2 x3 x4 x5 x6 
1 1.3 4.6 -0.9 10.5 9.5 -10.3 
2 1.4 2.6 5.6 "NA" -5.0 "NA" 
4 "NA" 4.3 -1.3 0.1 -0.7 "NA" 
5 1.4 "NA" "NA" -0.5 3.6 12.2 
6 -1.0 5.6 -3.4 "NA" 3.8 "NA" 
7 "NA" "NA" "NA" "NA" -7.8 "NA" 
8 0.3 3.7 0.3 21.5 9.8 -4.1 
9 0.7 5.3 -2.6 2.0 -12.2 3.3 
+2

Примите во внимание, что ваш 'NA' не' NA's, но факторы, потому что вы набрали с '" 'и так R читает их как символы строки. Поскольку che 'strAsAsFactor' по умолчанию имеет значение TRUE, это факторы. – SabDeM

+2

Да, вам нужно избавиться от котировок для R, чтобы интерпретировать эти «NA» как NA. Затем взгляните на функцию anyNA(), которую вы можете использовать для применения, чтобы удалить строки. – darwin

+0

просто исправил его. Спасибо. – user9292

ответ

3

Вы можете сделать это с помощью:

alldata_filtered <- alldata[rowSums(!is.na(alldata[2:6])) > 0, ] 

Для того, чтобы это друг от друга:

alldata[2:6] 

получает вас x1 до x5 колонок вы заботитесь о. (Лучшей практикой может быть сделать subset(alldata, select = x1:x5), чтобы вы не полагались на точные индексы столбцов). Тогда

!is.na(alldata[2:6]) 

дает TRUE/FALSE матрицы, показывающие, какие из них не являются Н.,

rowSums(!is.na(alldata[2:6])) 

говорит вам, сколько элементов в каждой строке не являются NA,

rowSums(!is.na(alldata[2:6])) > 0 

говорит вам в которые входят по меньшей мере один элемент, не относящийся к НС, и

alldata[rowSums(!is.na(alldata[2:6])) > 0, ] 

фильтры только для этих строк.

+0

Для ссылки OP, 'alldata [-1]' также хорош, если есть только столбец идентификатора, который нужно игнорировать. – Frank

+0

есть разница между вашим решением: 'alldata [rowSums (! Is.na (alldata [2: 6]))> 0,]' и my: 'alldata [-which (rowSums (is.па (ALLDATA [с ("x1", "х2", "x3", "x4", "x5")])) == 5),] '? – bjoseph

+1

@bjoseph Не большая разница. 1. Причина, по которой я использовал '> 0', заключается в том, что она надежна, если число используемых колонок изменилось. 2. «' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' ' 3. Я просто выбрал 2: 6 как короче c («x1», «x2» ...) и т. Д. –

0

бейс R решение, основанное на данных (читай мой комментарий). С realNA s это решение не работает, я думаю.

alldata[!rowSums(alldata[2:6] == "NA") == 5, ] 
    ID x1 x2 x3 x4 x5 x6 
1 1 1.3 4.6 -0.9 10.5 9.5 -10.3 
2 2 1.4 2.6 5.6 NA -5 NA 
4 4 NA 4.3 -1.3 0.1 -0.7 NA 
5 5 1.4 NA NA -0.5 3.6 12.2 
6 6 -1 5.6 -3.4 NA 3.8 NA 
7 7 NA NA NA NA -7.8 NA 
8 8 0.3 3.7 0.3 21.5 9.8 -4.1 
9 9 0.7 5.3 -2.6 2 -12.2 3.3 
0

Вот метод, использующий rowSums:

Сначала я преобразовывают ваш фактор NA к фактическому NA:

str(alldata) 
'data.frame': 10 obs. of 7 variables: 
$ ID: num 1 2 3 4 5 6 7 8 9 10 
$ x1: Factor w/ 6 levels "-1","0.3","0.7",..: 4 5 NA NA 5 1 NA 2 3 NA 
$ x2: Factor w/ 7 levels "2.6","3.7","4.3",..: 4 1 NA 3 NA 6 NA 2 5 NA 
$ x3: Factor w/ 7 levels "-0.9","-1.3",..: 1 6 NA 2 NA 4 NA 5 3 NA 
$ x4: Factor w/ 6 levels "-0.5","0.1","10.5",..: 3 NA NA 2 1 NA NA 5 4 NA 
$ x5: Factor w/ 9 levels "-0.7","-12.2",..: 7 3 NA 1 5 6 4 8 2 NA 
$ x6: Factor w/ 6 levels "-10.3","-4.1",..: 1 NA 3 NA 4 NA NA 2 5 NA 

alldata[alldata=="NA"]=NA 


sum(is.na(alldata)) 
    24 

Далее я продемонстрирую, как мы можем извлечь, какие строки имеют NA значения во всех значимых переменных :

which(rowSums(is.na(alldata[,c("x1","x2","x3","x4","x5")]))==5) 
[1] 3 10 

Наконец, мы извлекаем нужные строки (те, у которых нет NA во всех ключевых переменных):

alldata[-which(rowSums(is.na(alldata[,c("x1","x2","x3","x4","x5")]))==5),] 
    ID x1 x2 x3 x4 x5 x6 
1 1 1.3 4.6 -0.9 10.5 9.5 -10.3 
2 2 1.4 2.6 5.6 <NA> -5 <NA> 
4 4 <NA> 4.3 -1.3 0.1 -0.7 <NA> 
5 5 1.4 <NA> <NA> -0.5 3.6 12.2 
6 6 -1 5.6 -3.4 <NA> 3.8 <NA> 
7 7 <NA> <NA> <NA> <NA> -7.8 <NA> 
8 8 0.3 3.7 0.3 21.5 9.8 -4.1 
9 9 0.7 5.3 -2.6 2 -12.2 3.3 
Смежные вопросы