2013-04-02 3 views
3

Я хотел бы удалить строку из фрейма данных и суммировать полученные столбцы. Я знаю строку, которую хочу удалить, на основе ее содержимого, но не номер строки. Ниже приводятся три примера, два из которых работают. Использование - для удаления строки работает только в том случае, если первая строка должна быть удалена. Почему это?Удаление определенной строки без знания номера строки

Мой вопрос похож на этот: How to delete the first row of a dataframe in R? Однако там строка удаляется на основе номера строки.

# This works. 

state = 'OH' 

my.data = read.table(text = " 
     county y1990 y2000 
     cc  NA 2 
     OH  NA 10 
     bb  NA 1 
", sep = "", header = TRUE, na.strings = "NA", stringsAsFactors = FALSE) 

my.colsums2 <- colSums(my.data[!(my.data$county == state), 2:ncol(my.data)], na.rm=TRUE) 
my.colsums2 

# y1990 y2000 
# 0  3 

# This works. 

my.data = read.table(text = " 
     county y1990 y2000 
     OH  NA 10 
     cc  NA 2 
     bb  NA 1 
", sep = "", header = TRUE, na.strings = "NA", stringsAsFactors = FALSE) 

my.colsums2 <- colSums(my.data[-(my.data$county == state), 2:ncol(my.data)], na.rm=TRUE) 
my.colsums2 

# y1990 y2000 
# 0  3 

# This does not work. 

my.data = read.table(text = " 
     county y1990 y2000 
     cc  NA 2 
     OH  NA 10 
     bb  NA 1 
", sep = "", header = TRUE, na.strings = "NA", stringsAsFactors = FALSE) 

my.colsums2 <- colSums(my.data[-(my.data$county == state), 2:ncol(my.data)], na.rm=TRUE) 
my.colsums2 

# y1990 y2000 
# 0 11 

Я предполагаю, что я до сих пор путают по разнице между ! и -. Спасибо за любой совет.

+0

Я думаю, что это то, что вы ищете: 'colSums (my.data [my.data $ county! =" OH ", -1], na.rm = TRUE) ' – Arun

+1

На самом деле, два последних примера неверны, средний работает удачей. Отрицание булевой переменной получается с помощью '!', А не с '-'. –

ответ

6

Это должно прояснить разницу между - и !, и я подозреваю, что вы можете взять его оттуда;)

my.data$county == state 
# [1] TRUE FALSE FALSE 

!(my.data$county == state) 
# [1] FALSE TRUE TRUE 

-(my.data$county == state) 
# [1] -1 0 0 

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

+1

А именно, '-', примененный к булеву, сначала преобразует их в целые числа (0 и 1), а затем изменил их знак. – joran

+0

С третьим набором данных ваша третья строка: [1] 0 -1 0 Я все еще не понимаю, почему -1 0 0 позволяет получить нужный результат, но 0 -1 0 нет. Я подумаю об этом больше. Спасибо за ответ. –

+0

Да, спасибо @joran. '-X' ** буквально ** обрабатывается как' -1 * X', и во время его оценки значения 'logical' преобразуются в' numeric' (точно так же, как при выполнении 'X + 0' и т. Д.). В качестве интересной заметки сравните результаты '+ c (TRUE, FALSE)' и '-c (TRUE, FALSE)'. –

3

Я думаю, что важно помнить, что вы делаете. Когда вы передаете условный аргумент для подмножества строки или столбца, это должен быть полный TRUE или FALSE тест, или он должен быть числом, представляющим строку (или столбец).

Вот простой пример с вектором. Попробуйте ввести условия в консоль, чтобы увидеть, что они обеспечивают

Попробуйте эти:

x <- rnorm(20) 

## These use integer values for indexing 
x[which(x > 1)] # Numbers > Only those numbers which match 

## These use logical values for indexing 
x[x > 1] # Logical > Only those that are true 
x[!(x < 1)] # Logical > Only those that are false 

Плохое Поведение:

x[-which(x > 1)] # Positive numbers to negative numbers = BAD 
x[!which(x > 1)] # Converts numbers to logical = BAD 
x[-(x > 1)] # Converts logical to numeric = BAD 

Конкретные к вашему примеру:

!(my.data$county == state) # Converts TRUE/FALSE to FALSE/TRUE 
which(my.data$county != state) # Rows where my.data$count not equal state 

Лично Я рекомендую использовать which() во всех случаях, чтобы избежать потенциального отрицания логики al или преобразование числовых. Это также легче «перевести»

+0

Благодарим вас за ответ. Пожалуйста, подумайте о том, чтобы добавить рекомендуемый оператор, чтобы получить желаемый результат с помощью оригинального примера. Возможно, я скоро отправлю его, но это может быть не оптимальным. –

+0

Вот что мы пытаемся понять с этими ответами. Один создает вектор чисел (строк), другой создает логический вектор. Правильный вариант зависит от ситуации. Вы не сможете сказать '! Which (cond)', потому что вы смешиваете два разных типа переменных. Так же, как вы не должны говорить '- (x> 1)' –

+0

+1 Мне очень нравится этот ответ. (Также, пожалуйста, откажитесь от изменений, которые я только что сделал, если вы их не хотите.) –

Смежные вопросы