2015-01-06 2 views
3

Как преобразовать фрейм данных с матрицей счетчика с двумя столбцами в кадр данных с одним бинарным вектором в R? Например, у меня есть такой кадр данных, где id - это идентификатор субъекта, s и f - количество «успехов» и «сбоев» для этого субъекта, а x - третья переменная, описывающая некоторые черты этого предмета ,Как преобразовать двухстоечную матрицу «count» в двоичный вектор в R?

id s f x 
1 0 3 A 
2 2 1 A 
3 1 2 B 

я хочу этот фрейм данных должны быть преобразованы в:

id n x 
1 f A 
1 f A 
1 f A 
2 s A 
2 s A 
2 f A 
3 s B 
3 f B 
3 f B 

где столбец п указывает, является ли каждое испытание имеет успех (ы) или отказ (е).

Я уверен, что мог бы создать функцию для этого, но мне интересно, есть ли готовое решение.

ответ

5
dd <- read.table(text="id s f x 
    1 0 3 A 
    2 2 1 A 
    3 1 2 B", 
    header=TRUE) 

with(dd,data.frame(
     id=rep(id,s+f), 
     n=rep(rep(c("s","f"),nrow(dd)),c(rbind(s,f))), 
     x=rep(x,s+f))) 
+0

Отлично. Работает как шарм. См. Мою функцию ниже, используя этот код, который работает для любого фрейма данных, с любым количеством столбцов. Надеюсь, поможет! –

+0

Как насчет противоположности? – Bakaburg

+1

@ Бакабург, пожалуйста, задайте новый вопрос. Некоторая версия 'table' plus' as.data.frame' plus 'cbind' должна это сделать. –

4

Предлагается один из вариантов: tidyr, splitstackshape. Вы изменяете свои данные с помощью gather. Затем вы можете использовать expandRows в пакете splitstackshape. Вы просите R повторить каждую строку по номерам в столбце value. Для отображения целей я использовал arrange() из пакета dplyr. Но эта часть является необязательной.

library(tidyr) 
library(splitstackshape) 
library(dplyr) 

gather(mydf, variable, value, -id, -x) %>% 
expandRows("value") %>% 
arrange(id, x) 


# id x variable 
#1 1 A  f 
#2 1 A  f 
#3 1 A  f 
#4 2 A  s 
#5 2 A  s 
#6 2 A  f 
#7 3 B  s 
#8 3 B  f 
#9 3 B  f 
3

Используя отличный ответ Бен Bolker в выше, я создал короткую функцию, которая будет делать это для любого кадра данных, содержащего один столбец с подсчетов успеха, один столбец для подсчета отказов, а также любое количество дополнительных столбцов которые содержат информацию о каждой строке (теме). См. Пример ниже.

##################################################################### 
### cnt2bin (count to binary) takes a data frame with 2-column ###### 
### "count" response variable of successes and failures and ###### 
### converts it to long format, with one column showing  ###### 
### 0s and 1s for failures and successes.      ###### 
### data is data frame with 2-column response variable   ###### 
### suc and fail are character expressions for columns   ###### 
### containing counts of successes and failures respectively ###### 
##################################################################### 

cnt2bin <- function(data, suc, fail) { 

    xvars <- names(data)[names(data)!=suc & names(data)!=fail] 
    list <- lapply(xvars, function(z) with(data, rep(get(z), get(suc)+get(fail)))) 
    names(list) <- xvars 
    df <- as.data.frame(list) 
    with(data,data.frame(bin=rep(rep(c(1,0),nrow(data)),c(rbind(get(suc),get(fail)))), 
         df)) 
} 

Пример, где идентификатор является предмет идентификатора, с и е столбцы подсчета успехов и неудачи для каждого субъекта, а х и у являются переменными, которые описывают атрибуты каждого субъекта, чтобы быть расширен и добавлен в конечном кадр данных.

dd <- read.table(text="id s f x y 
         1 0 3 A A 
         2 2 1 A B 
         3 1 2 B B", 
        header=TRUE) 

cnt2bin(dd, "s", "f") 
+2

Приятно видеть, что вы тщательно комментируете свою функцию. Если вы хотите создать хорошую привычку, которая будет очень сильно помогать, если вы когда-либо захотите сделать пакет, вы можете прокомментировать функции, используя [синтаксис Roxygen2] (http://cran.r-project.org/web/packages /roxygen2/vignettes/rd.html). – Gregor

+0

спасибо, я посмотрю на это. веселит. –

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