我正在尝试将以下数据转换为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。应该不会太难,但是在所有示例中,我发现都是相反的情况。如何在datatable
或reshape
或任何其他流行的数据框包中完成此操作?
感谢您的任何提示。我知道通过转置数据的一种方法,但这似乎是一种效率不高的方法。
答案 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