2016-10-22 57 views
0

有成千上万个答案,描述如何从广泛变为长时间并由特定变量组织。我不知道我不是在缠着我的头。 我需要组织最初作为评价者,obs,val1,val2等开始的行进入评价者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')) 

我需要将数据组织成基于“评价者”列。凡是工作将是巨大的,特别是如果 'OBS'(观察数)可以保留,例如,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

'dcast(melt(df,1 :2),变量+ obs〜rater)'或'dcast(熔化(df,1:2),obs +变量〜rater)''如果你想让它按'obs'排序 –

+0

看着输出我不确定1:2选择什么。 ? – Donnied

+1

前两栏 –

回答

1

考虑rbinding两个VAL1VAL2dcast()电话。此外,添加一列以捕获相应的值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() an 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”列或使用unite()合并“OBS”和“EVAL”为一体。

+0

这仍然是'宽'而不是长格式。不在'评估者'下列出。 – Donnied

+0

@Donnied:我同意,但这是OP在他/她的帖子中成功的例子。 – biomiha

+0

谁是OP? – Donnied