将长格式数据重新整形为一行宽格式数据

时间:2017-02-28 15:53:42

标签: r reshape2 tidyr

我试图将一些数据从长格式转换为单行宽格式,下面是我的数据当前的外观;

<template>
    <span class="rating">
        <template v-for="item in items">
            <label class="radio-inline input-star">
                <input type="radio" class="input-rating" name="input-rating" v-bind:value="item.value" @click="rate(item.value)">
            </label>
        </template>
    </span>
</template>
<script>
    export default{
        data(){
            return{
                items: [
                    {value: 5},
                    {value: 4},
                    {value: 3},
                    {value: 2},
                    {value: 1}
                ]
            }
        },
        methods:{
            rate: function (star) {
                this.$http.post(window.BaseUrl + '/star', {star: star}).then(function (response) {
                    console.log('submitted');
                });
            },
        }
    }
</script>

以下是我希望我的数据看到最后的结果;

id var1 var2 var3
1     a    b    c
2     d    e    f
3     g    h    i

我已尝试使用id.1 var1.1 var2.1 var3.1 id.2 var1.2 var2.2 var3.2 id.3 var1.3 var2.3 var3.3 1 a b c 2 d e f 3 g h i 软件包和tidyr但似乎无法满足我的目标。任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:1)

如果感兴趣的是维护列类型,可以尝试do.call(cbind, split(mydf, 1:nrow(mydf)))

示例:

mydf <- structure(list(id = 1:3, var1 = structure(1:3, .Label = c("a",      
         "d", "g"), class = "factor"), var2 = c("b", "e", "h"), var3 = c("c",    
         "f", "i")), .Names = c("id", "var1", "var2", "var3"), row.names = c(NA, 
         3L), class = "data.frame")  

^^这就像你的数据,但&#34; var1&#34;列是一个因素。

do.call(cbind, split(mydf, 1:nrow(mydf)))
#   1.id 1.var1 1.var2 1.var3 2.id 2.var1 2.var2 2.var3 3.id 3.var1 3.var2 3.var3
# 1    1      a      b      c    2      d      e      f    3      g      h      i

str(.Last.value)
# 'data.frame': 1 obs. of  12 variables:
#  $ 1.id  : int 1
#  $ 1.var1: Factor w/ 3 levels "a","d","g": 1
#  $ 1.var2: chr "b"
#  $ 1.var3: chr "c"
#  $ 2.id  : int 2
#  $ 2.var1: Factor w/ 3 levels "a","d","g": 2
#  $ 2.var2: chr "e"
#  $ 2.var3: chr "f"
#  $ 3.id  : int 3
#  $ 3.var1: Factor w/ 3 levels "a","d","g": 3
#  $ 3.var2: chr "h"
#  $ 3.var3: chr "i"

^^请注意保留列类。

一点gsub可以使列名成为您所期望的。

或者,您可以添加两个附加列,一个填充值&#34; 1&#34;,另一个列的顺序从1到数据集中的行数,并将其用作&#34 ; ID&#34; (LHS)和&#34;时间&#34;带有reshape函数的(RHS)变量,或类似data.table dcast版本的value.var接受index.html的多个变量。

答案 1 :(得分:0)