将每季度事务信息的数据集重新排列为事务数据,每个事务一列

时间:2015-11-20 17:06:41

标签: r dplyr reshape

我很难找到重新排列数据集的方法。数据集具有以下形式:

数据

a <- data.frame(Id = c("123Ba", "672Es"), 
                FirstFlight = c("1999-10-04","1999-10-05"), 
                EnrollmentMonth = c("1999-10","2000-10"), 
                Q1_1999 = c(3,0), 
                Q2_1999 = c(0,1), 
                Q3_1999 = c(0,1))

#     Id FirstFlight EnrollmentMonth Q1_1999 Q2_1999 Q3_1999 
#1 123Ba  1999-10-04         1999-10       3       0       0
#2 672Es  1999-10-05         2000-10       0       1       1

变量Id是每个乘客的唯一标识符,后三个变量代表一年的季度(Q1_1999 = 1999年的第一季度)。此季度变量的值表示一个人在相应季度中的航班数量。

我尝试做的是重塑数据集,以便在特定季度乘客每次航班获得一行。因此,对于Quarter变量中的每个条目,应该生成相同数量的行,并且需要添加该季度的新变量,以允许识别该单个航班的季度...我希望它有点清晰现在。

预期输出

b <- data.frame(Id = c("123Ba", "123Ba", "123Ba","672Es","672Es"), 
                Quarter = c("Q1_1999","Q1_1999","Q1_1999","Q2_1999", "Q3_1999"), 
                FirstFlight = c("1999-10-04","1999-10-04","1999-10-04","1999-10-05","1999-10-05" ), 
                EnrollmentMonth = c("1999-10","1999-10","1999-10","2000-10" ,"2000-10"))

#  Id    Quarter FirstFlight EnrollmentMonth
#1 123Ba Q1_1999  1999-10-04         1999-10
#2 123Ba Q1_1999  1999-10-04         1999-10
#3 123Ba Q1_1999  1999-10-04         1999-10
#4 672Es Q2_1999  1999-10-05         2000-10
#5 672Es Q3_1999  1999-10-05         2000-10

如何重新排列数据以获得此结果?

2 个答案:

答案 0 :(得分:1)

var Component = React.createClass({

  getInitialState() {
      return {
          options: [
              'Row 1',
              'Row 2'
          ]
      };
  },

  rows: [],

  onChange(row) {
      this.rows[row].forEach((input) => {
          // The values of all inputs in the row that changed
          console.log(input.getDOMNode().value);
      });
  },

  renderRows() {
      this.rows = [];
      return this.state.options.map((opt,i) => {
          // Store and cache a new row and store inputs in the
          // array using `refs` below.
          this.rows.push([]);
          return (<tr key={i}>
              <td>{opt}</td>
              <td>
                  <input ref={(input) => this.rows[i].push(input)} onChange={this.onChange.bind(this, i)} />
              </td>
              <td>
                  <input ref={(input) => this.rows[i].push(input)} onChange={this.onChange.bind(this, i)} />
              </td>
          </tr>);
      });
  },

  render() {
      return (
          <table>
              {this.renderRows()}
          </table>
      );
  }
});

这样你就可以在每次飞行时都有一行,在col中有季度信息。累积数据acc。到ID,只需对它进行排序。

希望它有所帮助!

答案 1 :(得分:0)

以下是使用splitstackshape

的选项
library(splitstackshape)
a$Quarter = apply(a, 1, function(x) toString(rep(names(x[4:6]), x[4:6])))
cSplit(setDT(a), 'Quarter', ',', 'long')[,-(4:6), with = F]

#      Id FirstFlight EnrollmentMonth Quarter
#1: 123Ba  1999-10-04         1999-10 Q1_1999
#2: 123Ba  1999-10-04         1999-10 Q1_1999
#3: 123Ba  1999-10-04         1999-10 Q1_1999
#4: 672Es  1999-10-05         2000-10 Q2_1999
#5: 672Es  1999-10-05         2000-10 Q3_1999