从行名重整为宽,保留ID变量

时间:2018-08-10 22:44:19

标签: r reshape reshape2 rowname

我正在尝试将以下数据转换为R中的长格式:

testdata <- data.frame(rnorm(10),rnorm(10),rnorm(10))
rownames(testdata) <- paste0("ID",1:10) # Ids
colnames(testdata) <- c(2001,2002,2003) # Years
testdata

因此,列=时间,行= ID。应该不会太难,但是在所有示例中,我发现都是相反的情况。如何在datatablereshape或任何其他流行的数据框包中完成此操作? 感谢您的任何提示。我知道通过转置数据的一种方法,但这似乎是一种效率不高的方法。

4 个答案:

答案 0 :(得分:2)

@Akron的有用答案:

reshape2::melt(as.matrix(testdata))

“但是为什么?”部分:

行名中包含重要信息,通常不是存储重要信息的好地方。我们在重塑时需要这些信息。那么问题就变成了,如果我们输入矩阵而不输入数据帧,为什么melt使用该信息?

原因是melt是一个泛型函数,它根据您输入到其中的数据类型来调度方法(又称更特定的函数)。因此,如果m是矩阵,并且您调用melt(m),则R实际上正在执行melt.matrix(m)。相反,如果df是一个数据帧,而您调用melt(df),则R实际上正在执行melt.data.frame(df)melt.matrix()melt.data.frame()这两个函数对行名的处理方式不同;方法melt.matrix以您想要的方式使用这些行名,而方法melt.data.frame则不使用。因此,为了获得所需的输出,您需要向melt中馈入矩阵(而非数据帧)。

只是为了说明一下,如果我们将ID信息存储在data.frame的列中(如下面的testdata2中)而不是作为行名(如上面的testdata中),那么我们在将数据帧馈送到melt方面表现不错:

testdata2 <- data.frame(
    ID       =  1:10,
    year2001 = rnorm(10),
    year2002 = rnorm(10),
    year2003 = rnorm(10) )

reshape2::melt(testdata2, "ID")
reshape2::melt(testdata2, id.vars="ID", measure.vars=2:4) #equivalently, but verbosely

答案 1 :(得分:1)

对我来说,明显的破解似乎是将数据框的行名增加回常规列;那么您可以使用reshape/reshape2/tidyr::gather

中的任何一个
> data.frame(ID=rownames(testdata), testdata, row.names=NULL)
     ID      X2001      X2002       X2003
1   ID1  0.6714540  1.1516917  0.51332801
2   ID2 -1.7309721 -1.8018835  1.54385452
3   ID3 -0.4831349 -1.3965915 -0.72819988
4   ID4  1.2591651  1.2436120  1.01472455
5   ID5  1.2346326 -1.4587475 -1.75097483
6   ID6  0.4279562  0.2595588  1.36560258
7   ID7  0.9990642 -1.0306002 -1.10165672
8   ID8  1.2118510 -0.3577358 -0.11696953
9   ID9  0.3074985  0.5177188 -0.09954961
10 ID10 -1.0418608 -1.8419336 -0.65401215

((请注意,它会将您的非法同名“固定”为“ X2001”,“ X2002” ...如果您真的想保留它们,请使用...check.names=FALSE)

答案 2 :(得分:1)

只需将akrun's comment转换为完整答案:

$('#bold').click(function(){
  var string = window.getSelection().toString();
  var bolded = '<b>' + string + '</b>';
  var selC, range;
      if (window.getSelection) {
          selC = window.getSelection();
          if (selC.rangeCount) {
              range = selC.getRangeAt(0);
              range.deleteContents();
              range.insertNode(document.createTextNode(bolded));
          }
      } else if (document.selection && document.selection.createRange) {
          range = document.selection.createRange();
          range.text = bolded;
      }
}); 
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<table width="50%">
    <tr>
        <td>
            <div>
                <div>
                    <span><input type=button value="B" id="bold"></span>
                </div>
                <div contenteditable="true" style="height: 300px;width: 300px;border: 1px solid black">
                    
                </div>
            </div>  
        </td>
    </tr>
</table>

答案 3 :(得分:0)

您可以使用tidyr库

Cookie