2013-10-03 4 views
0

Мне нужно удалить определенные строки моего фрейма, но у меня проблемы. Набор данных выглядит следующим образом:Как удалить записи в dataframe

> head(mergedmalefemale) 
    coupleid gender shop time amount 
1  1  W 3 1 29.05 
2  1  W 1 2 31.65 
3  1  W 3 3  NA 
4  1  W 2 4 17.75 
5  1  W 3 5 -28.40 
6  2  W 1 1 42.30 

Что я хотел бы сделать, это удалить все записи в coupleid, где по крайней мере одна сумма является NA или отрицательным. В приведенном выше примере все строки с паролем «1» должны быть удалены, так как существуют строки с отрицательными значениями и NA. Я пробовал его с такими функциями, как na.omit(mergedmalefemale) и т. Д., Но это удаляет только строки с NA, но не с другими рядами с тем же cupleid. Поскольку я новичок, я был бы счастлив, если бы кто-то мог мне помочь.

+0

В будущем обеспечить некоторый код, который мы можем вырезать и вставить для получения данных выборки. Делает нашу жизнь проще. – Spacedman

ответ

2

Поскольку вы не хотите, чтобы только опустить суммы, которые NA или отрицательным, но хотите пропустить все данные с одинаковым идентификатором, вы должны сначала найти идентификаторы вы хотите удалить, а затем удалить их.

mergedmalefemale <- read.table(text=" 
    coupleid gender shop time amount 
    1  1  W 3 1 29.05 
    2  1  W 1 2 31.65 
    3  1  W 3 3  NA 
    4  1  W 2 4 17.75 
    5  1  W 3 5 -28.40 
    6  2  W 1 1 42.30", 
    header=TRUE) 

# Find NA and negative amounts 
del <- is.na(mergedmalefemale[,"amount"]) | mergedmalefemale[,"amount"]<0 
# Find coupleid with NA or negative amounts 
ids <- unique(mergedmalefemale[del,"coupleid"]) 
# Remove data with coupleid such that amount is NA or negative 
mergedmalefemale[!mergedmalefemale[,"coupleid"] %in% ids,] 
+1

Предполагая, что для начинающих несколько подмножеств могут быть немного запутанными (это было для меня), обратите внимание, что вы также можете использовать подмножество() вместо последней строки: 'subset (mergedmalefemale,! Parid% in% ids)' – Marianne

1

Вот один из вариантов. Рассмотрим ваш data.frame называется df

> na.omit(df[ rowSums(df[, sapply(df, is.numeric)]< 0, na.rm=TRUE) ==0, ]) 
    coupleid gender shop time amount 
1  1  W 3 1 29.05 
2  1  W 1 2 31.65 
4  1  W 2 4 17.75 
6  2  W 1 1 42.30 
0

Вот довольно грязный способ

# identify the coupleids that need to stay/be removed 
agg <- aggregate(amount ~ coupleid, data=mergedmalefemale, FUN=function(x) min(is.na(x)|(x>0))) 

# insert a column alongside "amount.y" that puts a 0 next to rows to be deleted 
df.1 <- merge(mergedmalefemale, agg, by="coupleid") 

# delete the rows 
df.1 <- df.1[df.1$amount.y == 1, ] 
1

Еще одна хорошая возможность применить data.table

require(data.table) 
mergedmalefemale <- as.data.table(mergedmalefemale) 
mergedmalefemale[, if(!any(is.na(amount) | amount < 0)) .SD, by=coupleid] 

# coupleid gender shop time amount 
#1:  2  W 1 1 42.3 
Смежные вопросы