2010-04-21 5 views
3

У меня есть data.frame в R; это называется p. Каждый элемент в data.frame имеет значение True или False. Моя переменная p имеет, скажем, m строки и n столбцы. Для каждой строки существует только один элемент TRUE.R: манипулирование data.frames, содержащими строки и логические значения

Он также имеет имена столбцов, которые являются строками. То, что я хотел бы сделать, это следующее:

  1. Для каждой строки в p я вижу TRUE Я хотел бы заменить с именем соответствующего столбца
  2. Я бы тогда хотел свернуть data.frame , который теперь содержит FALSE s и имена столбцов, к одному вектору, который будет содержать m элементов.
  3. Я хотел бы сделать это с помощью R-thonic, чтобы продолжить мое просветление в R и внести свой вклад в мир без for-loops.

я могу сделать шаг 1, используя следующий цикл:

for (i in seq(length(colnames(p)))) { 
    p[p[,i]==TRUE,i]=colnames(p)[i] 
} 

но Тереза ​​нет красоты здесь, и я полностью подписался на этот обмен на петли-в-R-это-вероятно, неправильный менталитет , Может быть, неправильно слишком сильно, но они, конечно, невелики.

Я действительно не знаю, как сделать шаг 2. Я как бы надеялся, что сумма строки и FALSE вернет строку, но это не так. Я как бы надеялся, что могу использовать какой-либо оператор OR, но не могу этого понять (Python отвечает на False or 'bob' с помощью 'bob'). Поэтому, опять же, я обращаюсь к вам за красивыми людьми Rstats за помощью!

ответ

4

Вот некоторые примерные данные:

df <- data.frame(a=c(FALSE, TRUE, FALSE), b=c(TRUE, FALSE, FALSE), c=c(FALSE, FALSE, TRUE)) 

Вы можете использовать apply, чтобы сделать что-то вроде этого:

names(df)[apply(df, 1, which)] 

Или без apply с помощью which непосредственно:

idx <- which(as.matrix(df), arr.ind=T) 
names(df)[idx[order(idx[,1]),"col"]] 
+0

Я становлюсь старым. Вы били меня на пять минут ;-) –

+0

см. Комментарий по решению Дирка! Второй подход не дает того же ответа, что и первый. –

+0

Я исправил это. – Shane

3

Использование apply подметать ваш индекс ugh и использовать этот индекс для доступа к именам столбцов:

> df <- data.frame(a=c(TRUE,FALSE,FALSE),b=c(FALSE,FALSE,TRUE), 
+     c=c(FALSE,TRUE,FALSE)) 
> df 
     a  b  c 
1 TRUE FALSE FALSE 
2 FALSE FALSE TRUE 
3 FALSE TRUE FALSE 
> colnames(df)[apply(df, 1, which)] 
[1] "a" "c" "b" 
> 
+0

Ничего себе. Но опять же мы придумали примерно одно и то же решение одновременно. Даже данные! – Shane

+0

Вы выигрываете пять минут, но я получаю более высокий технический балл за использование TRUE/FALSE вместо очень непослушного и обескураженного T/F :) –

+0

, тогда кто должен получить зеленый галочку? (спасибо оба, кстати) –

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