【问题标题】:Reshape data into long columns based on variable in R for IRR基于 R 中的 IRR 变量将数据重新整形为长列
【发布时间】:2016-10-22 20:22:19
【问题描述】:

有数以千计的答案描述了如何从宽到长重塑并按某些变量进行组织。我不知道我没有把头缠住。 我需要将最初以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'))

我需要根据“评估者”将数据组织成列。任何可行的东西都会很棒,尤其是如果可以保留“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

这没有帮助。

?

【问题讨论】:

  • dcast(melt(df, 1:2), variable + obs ~ rater) 或 dcast(melt(df, 1:2), obs + variable ~ rater) 如果您希望它按 obs 排序
  • 查看输出我不确定 1:2 选择了什么。 ?
  • 前两列
  • 作为 id.vars。那是我的猜测。只是确保因为我在转换到实际数据时遇到了一些麻烦。即因子被显示为数字。

标签: r dcast


【解决方案1】:

考虑 rbinding dcast() 调用 val1 和 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

如果有很多 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

【讨论】:

    【解决方案2】:

    tidyverse 选项。

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

    然后,您可以选择完全删除“obs”列或使用unite() 将“obs”和“eval”合并为一个。

    【讨论】:

    • 这仍然是“宽”而不是长格式。未在“评估者”下列出。
    • @Donnied:我同意,但这是 OP 在他/她的帖子中展示的成功示例。
    • 谁是 OP?
    • 是的,对不起,是你。道歉。那么您能否修改“相反,我需要类似以下内容:”以反映您正在寻找的确切内容。
    • 这就是我一直在寻找的——在各个评分者下列出的所有值。并且如第二句所述:“我需要将最初以 rater、obs、val1、val2 等开头的行组织起来。Into columns under rating for IRR。”
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-05-06
    • 1970-01-01
    • 1970-01-01
    • 2012-12-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多