crs*_*crs 14 r reshape dataframe
我甚至不确定如何正确地标题!
假设我有一个数据帧d:
当前数据帧:
d <- data.frame(sample = LETTERS[1:2], cat = letters[11:20], count = c(1:10))
sample cat count
1 A k 1
2 B l 2
3 A m 3
4 B n 4
5 A o 5
6 B p 6
7 A q 7
8 B r 8
9 A s 9
10 B t 10
Run Code Online (Sandbox Code Playgroud)
我正在尝试重新安排一些事情,使每个cat值成为它自己的列,样本仍然是一列(或成为行名),count将是新cat列中的值,其中0表示样品没有猫的数量.像这样:
期望的数据帧布局:
sample k l m n o p q r s t
1 A 1 0 3 0 5 0 7 0 9 0
2 B 0 2 0 4 0 6 0 8 0 10
Run Code Online (Sandbox Code Playgroud)
最好的方法是什么?
这是我得到的:
for (i in unique(d$sample)) {
s <- d[d$sample==i,]
st <- as.data.frame(t(s[,3]))
colnames(st) <- s$cat
rownames(st) <- i
}
Run Code Online (Sandbox Code Playgroud)
即循环遍历原始数据帧中的样本,并转置每个样本子集.所以在这种情况下我得到了
k m o q s
A 1 3 5 7 9
Run Code Online (Sandbox Code Playgroud)
和
l n p r t
B 2 4 6 8 10
Run Code Online (Sandbox Code Playgroud)
这就是我陷入困境的地方.我已经尝试了一些使用merge(),bind(),apply(),...的东西,但我似乎无法找到正确的东西.另外,我不禁想知道上面的循环是否是必要的步骤 - 或许是unstack()?
毋庸置疑,我是R的新手...如果有人可以帮助我,我将不胜感激!
PS原因我正在尝试重新安排我的数据帧,希望能够更容易地绘制值(即我希望以表格格式显示实际的df).
谢谢!
Jil*_*ina 15
使用dcast
reshape2包
> dcast(d, sample~cat, fill=0)
sample k l m n o p q r s t
1 A 1 0 3 0 5 0 7 0 9 0
2 B 0 2 0 4 0 6 0 8 0 10
Run Code Online (Sandbox Code Playgroud)
xtabs
从基地是另一种选择
> xtabs(count~sample+cat, d)
cat
sample k l m n o p q r s t
A 1 0 3 0 5 0 7 0 9 0
B 0 2 0 4 0 6 0 8 0 10
Run Code Online (Sandbox Code Playgroud)
如果您更喜欢输出为data.frame,请尝试:
> as.data.frame.matrix(xtabs(count~sample+cat, d))
k l m n o p q r s t
A 1 0 3 0 5 0 7 0 9 0
B 0 2 0 4 0 6 0 8 0 10
Run Code Online (Sandbox Code Playgroud)
Met*_*ics 11
使用reshape
基数R:
nn<-reshape(d,timevar="cat",idvar="sample",direction="wide")
names(nn)[-1]<-as.character(d$cat)
nn[is.na(nn)]<-0
> nn
sample k l m n o p q r s t
1 A 1 0 3 0 5 0 7 0 9 0
2 B 0 2 0 4 0 6 0 8 0 10
Run Code Online (Sandbox Code Playgroud)