2016-10-22 1 views
0

Есть тысячи ответов, описывающих, как переформатировать из широких и длинных и упорядочить по определенным переменным. Я не знаю, чем я не обволакиваю голову. Мне нужно организовать строки, которые первоначально начинаются как rater, obs, val1, val2 и т. Д. В столбцы под rater для IRR.Измените данные на длинные столбцы на основе переменной в R для IRR

Учитывая формат, похожий на мои данные, которые могут быть созданы с:

r1 <- c('bob', 'sally', "george", "bob", "sally", "george") 
r2 <- c(1,1,1,2,2,2) 
r3 <- c("bad", "good", "good", "good", "good", "bad") 
r4 <- c("bad", "bad", "good", "good", "good", "bad") 
df=data.frame(r1,r2,r3,r4) 
df = setNames(df, c('rater','obs', 'val1', 'val2')) 

Мне нужно организовать данные в столбцы, основанные на «рейтер». Все, что работает было бы здорово, особенно если «набл» (число наблюдений) может быть сохранена, например, obs1_val1, obs1_val2 и т.д.

За что-то вдоль линий:

dcast(df, obs ~ rater) 

Который создает:

obs bob george sally 
1 1 bad good bad 
2 2 good bad good 

Однако это агрегирует и удаляет значения для val2.

Скорее, мне нужно что-то вдоль линий:

   bob sally george 
    obs1_val1 bad good good 
    obs1_val2 bad bad  good 
    obs2_val1 good good bad 
    obs2_val2 good good bad 

Глядя на аналогичной responses, я вижу рекомендацию melt, а затем dcast [Я на самом деле не хочу, чтобы агрегировать - а просто складывают в столбцы].

Как струны для знач1 и val2 следует учитывать факторы, я попытался:

df$"val1" <- factor(df$val1, levels=c("bad","good")) 
df$"val2" <- factor(df$val2, levels=c("bad","good")) 

без какого-либо эффекта. Получение:

Aggregation function missing: defaulting to length 

    obs bob george sally 
1 1 2  2  2 
2 2 2  2  2 

который не помогает.

?

+2

'dcast (расплав (df, 1) : 2), variable + obs ~ rater) 'или' dcast (melt (df, 1: 2), obs + variable ~ rater) ', если вы хотите, чтобы его сортировали по' obs' –

+0

Глядя на результат, я не уверен, что выбирает 1: 2. ? – Donnied

+1

Первые две колонки –

ответ

1

Рассмотрим rbinding dcast() звонки для обоих знач1 и val2 колонн. Кроме того, добавьте столбец, чтобы зафиксировать значение val (так как оно отбрасывается во время dcast).Следовательно, использование data.frame():

rdf <- rbind(data.frame(val=c("va1"), dcast(df, obs ~ rater, value.var="val1")), 
      data.frame(val=c("va2"), dcast(df, obs ~ rater, value.var="val2"))) 

# val obs bob george sally 
# 1 va1 1 bad good good 
# 2 va1 2 good bad good 
# 3 va2 1 bad good bad 
# 4 va2 2 good bad good 

Должна ли быть много знач колонны, итерация с lapply(), а затем do.call(rbind, ...) в списке:

valcols <- names(df)[grep("val", names(df))] 

dfList <- lapply(valcols, function(v) { 
    data.frame(val=c(v), dcast(df, obs ~ rater, value.var=v)) 
})  
rdf <- do.call(rbind, dfList) 

Наконец, чтобы сделать переменную символьные факторы требуют as.factor() в a sapply():

rdf <- data.frame(sapply(rdf, as.factor)) 
str(rdf) 

# 'data.frame': 4 obs. of 5 variables: 
# $ val : Factor w/ 2 levels "val1","val2": 1 1 2 2 
# $ obs : Factor w/ 2 levels "1","2": 1 2 1 2 
# $ bob : Factor w/ 2 levels "bad","good": 1 2 1 2 
# $ george: Factor w/ 2 levels "bad","good": 2 1 2 1 
# $ sally : Factor w/ 2 levels "bad","good": 2 2 1 2 
1

Вариант tidyverse.

library(tidyverse) 
df %>% 
    gather(val1, val2, key = "eval", value = "value") %>% 
    spread(key = rater, value = value) 

Вы можете выбрать либо полностью отказаться от колонки «OBS» или слияния «набл» и «Eval» в один с помощью unite().

+0

Это все еще в «широком», а не длинном формате. Не указывается в разделе «rater». – Donnied

+0

@Donnied: Я согласен, но это то, что OP показало как успешный пример в его/ее сообщении. – biomiha

+0

Кто был ОП? – Donnied