16

我什至不确定如何正确命名问题!

假设我有一个数据框 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

我正在尝试重新安排事情,使每个 cat 值成为它自己的一列,sample 仍然是一列(或成为行名),并且 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

解决这个问题的最佳方法是什么?

这是据我所知:

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
} 

即循环遍历原始数据帧中的样本,并对每个样本子集进行转置。所以在这种情况下我得到

   k m o q s
 A 1 3 5 7 9

   l n p r  t
 B 2 4 6 8 10

这就是我卡住的地方。我用merge, bind, apply,... 尝试了很多东西,但我似乎无法找到正确的东西。另外,我不禁想知道上面的循环是否是必要的一步——unstack也许有什么?

不用说,我是 R 的新手......如果有人可以帮助我,将不胜感激!

PS我试图重新排列我的数据框的原因是希望使值的绘制更容易(即我想在表格格式的图中显示实际的df)。

谢谢!

4

3 回答 3

17

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

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

如果您希望输出是 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
于 2013-10-13T14:10:14.543 回答
12

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
于 2013-10-13T14:16:45.650 回答
0

这也是一个tidyverse可能感兴趣的解决方案:

library(tidyr)

d %>%
  pivot_wider(names_from = cat, 
              values_from = count, 
              values_fill = 0)

# A tibble: 2 x 11
  sample     k     l     m     n     o     p     q     r     s     t
  <chr>  <int> <int> <int> <int> <int> <int> <int> <int> <int> <int>
1 A          1     0     3     0     5     0     7     0     9     0
2 B          0     2     0     4     0     6     0     8     0    10
于 2021-08-24T18:50:21.690 回答