R: манипулирование data.frames, содержащим строки и логические значения - PullRequest
3 голосов
/ 21 апреля 2010

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

У него также есть имена столбцов, которые являются строками. Я хотел бы сделать следующее:

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

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

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

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

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

Ответы [ 2 ]

4 голосов
/ 21 апреля 2010

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

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"]]
3 голосов
/ 21 апреля 2010

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

> 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"
> 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...