2010-08-31 2 views
0

база данных $ VAR , которая имеет значения 0 и 1.Redefine Data Frame в R

Как я могу переопределить фрейм данных так, чтобы 1 были удалены?

Спасибо!

+1

Хочет значение 1 или удалено все наблюдения со значением 1 удалены? Или вы хотите разделить кадр данных на отдельные наблюдения с помощью VAR == 0 и VAR == 1? – Greg

+0

Я хочу, чтобы все наблюдения со значением 1 удалялись, так что, когда я вызываю 'database $ VAR', я получаю только 0. Благодаря! – Brian

ответ

1

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

R> df <- data.frame(VAR = c(0,1,0,1,1)) 
R> df[ -which(df[,"VAR"]==1), , drop=FALSE] 
    VAR 
1 0 
3 0 
R> 

Мы используем which(booleanExpr) получить индексы, для которых выполнено ваше состояние, а затем использовать -1 на них, чтобы исключить их и, наконец, использовать drop=FALSE, чтобы наши data.frame из одной колонки от коллапса в вектор.

+0

Интересно, но если после этого я вызову 'database $ VAR', я все равно получаю как 1, так и 0 .... – Brian

+0

Вам придется назначить результат обратно в' database' или назначить его новой переменной. – Greg

+0

Когда я иду: 'data1base $ NEW <- df' Я получаю сообщение об ошибке: Ошибка в $ <-. Data.frame' (' * tmp * '," NEW ", value = list (VAR = c (0, 1,: замена имеет 5 строк, данные имеют 819 – Brian

3

TMTOWTDI

Использование subset:

df.new <- subset(df, VAR == 0) 

EDIT:

решение Давида, кажется, самый быстрый на моей машине. Подсчет кажется самым медленным. Я даже не буду притворяться, чтобы попытаться понять, что происходит при том, что объясняет эти различия:

> df <- data.frame(y=rep(c(1,0), times=1000000)) 
> 
> system.time(df[ -which(df[,"y"]==1), , drop=FALSE]) 
    user system elapsed 
    0.16 0.05 0.23 
> system.time(df[which(df$y == 0), ]) 
    user system elapsed 
    0.03 0.01 0.06 
> system.time(subset(df, y == 0)) 
    user system elapsed 
    0.14 0.09 0.27 
+0

Включите 'drop = FALSE' во втором времени. Это замедлит этот метод. – Marek

2

Я upvote ответ, используя «подмножество», если бы я имел репутацию за это :-). Вы также можете использовать логический вектор непосредственно для Подменю - нет необходимости «который»:

d <- data.frame(VAR = c(0,1,0,1,1)) 
d[d$VAR == 0, , drop=FALSE] 

Я с удивлением обнаружил логическую версию немного быстрее, по крайней мере в одном случае. (Я ожидал «который» версия может выиграть из-за R, возможно предварительным выделением надлежащего объема памяти для результата.)

> d <- data.frame(y=rep(c(1,0), times=1000000)) 
> system.time(d[which(d$y == 0), ]) 
    user system elapsed 
    0.119 0.067 0.188 
> system.time(d[d$y == 0, ]) 
    user system elapsed 
    0.049 0.024 0.074 
+0

+1 для синхронизации кода – midtiby

+0

Вы должны включить 'drop = FALSE' в настройках времени. И для меня «кто» быстрее (с TRUE или FALSE). – Marek

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