在没有聚合的情况下在R中重塑(例如,MTurk响应字符串) [英] Reshape in R without aggregation (for example MTurk response strings)

查看:13
本文介绍了在没有聚合的情况下在R中重塑(例如,MTurk响应字符串)的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

通常,我会使用非常基本的从长到宽的重塑,但它似乎正在丢弃我的聚合变量。设置是我有一个关于机械Turk的作业,我执行了三份-我希望Mtur1,Mturk2,Mtur3的答案在数据框中是它们自己的变量,但由我在作业中输入的字段唯一标识,这样我以后就可以用函数将它们相互比较。

当前格式:

> head(mturk)
  AssignmentStatus     Input.id  Input.State  Answer.Q1thing
1         Approved       134231           NY         Myguess
2         Approved       134231           NY         Myguess
3         Approved       134231           NY        BadGuess
4        Submitted       134812           CA         Another
5         Approved       134812           CA         Another
6         Approved       134812           CA         Another

我希望这件事成为

Input.id   Input.State Answer.Q1thing.1 Answer.Q1thing.2 Answer.Q1thing.3  AssignmentStatus.1 AssignmentStatus.2  AssignmentStatus.3
134231              NY          Myguess          Myguess         BadGuess          Approved             Approved            Approved
134812              CA          Another          Another          Another         Submitted             Approved            Approved

或者理想情况下,如果有一个变量可以在操作中重做列名...

Id               State          Answer1          Answer2          Answer3          Status1               Status2             Status3
134231              NY          Myguess          Myguess         BadGuess          Approved             Approved            Approved
134812              CA          Another          Another          Another         Submitted             Approved            Approved

dat <- reshape(mturk, timevar="Answer.Q1thing", idvar=c("Input.id", "Input.state"), direction="wide")
这似乎失败了,因为大多数重塑长到宽的函数都希望变宽的变量本身是一个明确的文本字段-也就是说,这不是一个从长到宽的重塑操作,因为我不想要一个名为"MyGuess""BadGuess"和"Another"的变量,但我想要一个包含这些值的泛型"Answer.X"变量。我不会尝试以任何方式进行汇总,例如Mean或Sum,只是将值列在新位置。

所以,这个问题有两个方向:

  1. 这种操作有没有别的名字?这是展开、展开、取消连接还是什么?
  2. 如何在R中执行此操作?

推荐答案

如果您的数据位于data.table中,则它是一行可以执行以下操作:

library(data.table)    
mturk.dt <- as.data.table(mturk)

mturk.dt[, as.list(
         rbind(c(Answer.Q1thing, AssignmentStatus))
         )
        , by=list(Id=Input.id, State=Input.State)]

请注意,by参数也处理名称更改!


如果要正确命名其他列,请在后面使用setnames,或者更动态地在j=..参数中使用setattr,如下所示:

事后:

## Assuming 'res' is the reshaped data.table form above:
## Change the names of the six V1, V2.. columns 
setnames(res, paste0("V", 1:6), c(paste0("Answer", 1:3), paste0("Status", 1:3)))

动态,j=..

## Use `as.data.table` instead of `as.list`, to preserve new names
mturk.dt[, as.data.table(
         rbind(c(
              setattr(Answer.Q1thing,   "names", paste0("Answer", seq(Answer.Q1thing  )))
            , setattr(AssignmentStatus, "names", paste0("Status", seq(AssignmentStatus)))
            ))
         )
        , by=list(Id=Input.id, State=Input.State)]

       Id State Answer1 Answer2  Answer3  Status1  Status2  Status3
1: 134231    NY Myguess Myguess BadGuess Approved Approved Approved
2: 134812    CA Myguess Myguess BadGuess Approved Approved Approved

这篇关于在没有聚合的情况下在R中重塑(例如,MTurk响应字符串)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆