基于R中IRR的变量将数据重新整形为长列

时间:2016-10-22 20:22:20

标签: r dcast

有成千上万的答案描述了如何从长到长重塑并按某些变量进行组织。我不知道我没有把头包裹起来。 我需要组织最初以rater,obs,val1,val2等开头的行到IRR的rater下的列中。

给出与我的数据类似的格式,可以用:

创建
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'))

我需要根据&#39; rater&#39;将数据整理到列中。任何有效的东西都会很棒,特别是如果&#39; obs&#39; (观察号)可以保存,例如,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的建议[我实际上并不想聚合 - 而只是堆叠在列中]。

由于val1和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 个答案:

答案 0 :(得分:1)

tidyverse选项。

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

然后您可以选择放弃&#39; obs&#39;列完全或合并&#39; obs&#39;和&#39; eval&#39;使用unite()进入一个。

答案 1 :(得分:1)

考虑对 val1 val2 列进行dcast()调用。此外,添加一列以捕获相应的 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

如果有很多 val 列,请在列表中使用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()中的因子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