如何通过保留标题名称来转置表

时间:2018-01-01 21:07:54

标签: r tidyverse

我简化了上一个问题。不便之处敬请原谅。 如何通过保留标题名称来转置表。我也无法使用t()来实现这一目标。

q <- tribble(
  ~name, ~g1, ~g2, ~g3,
  "t1", 0,  1,  2,
  "t1", 2,  2,  2,
  "t2", 1,  2,  3,
  "t2", 3,  3,  3,
  "t4", 4,  4,  4
)


q %>%
  rownames_to_column %>% 
  gather(row, value, -rowname) %>% 
  spread(rowname, value) 

期望的输出

name    t1    t1    t2    t2    t4
g1     0     2     1     3     4
g2     1     2     2     3     4
g3     2     2     3     3     4

1 个答案:

答案 0 :(得分:1)

如果你想创造&#34; t#&#34;使用spread包中的tidyr命名列,请注意它按字母顺序排列,&amp;并不能很好地处理重复的列名。

您的示例有两行名为&#34; t1&#34; &安培;两行命名为&#34; t2&#34;。所以需要处理。

在此示例中,的名称​​ 按字母顺序排列,但假设并非总是如此,您可以在运行顺序中使用一系列数字作为名称前缀。< / p>

可以修改以下内容以便工作:

qt <- q %>%
  # make row names unique & sorted correctly in increasing order
  # by appending numbers in running order
  mutate(name = paste(seq(1, n()),
                      name,
                      sep = "_")) %>%
  gather(row, value, -name) %>% 
  spread(name, value)

# strip away the appended numbers from the newly created column names
names(qt) <- sapply(strsplit(names(qt), "_"), function(x){x[2]})

> qt
# A tibble: 3 x 6
   `NA`    t1    t1    t2    t2    t4
* <chr> <dbl> <dbl> <dbl> <dbl> <dbl>
1    g1     0     2     1     3     4
2    g2     1     2     2     3     4
3    g3     2     2     3     3     4

或者,如果您不需要tidyverse解决方案:

# transpose the data frame without the name column
qt <- t(q[-1]) 

# add name column back as a dimname attribute
attr(qt, "dimnames")[[2]] <- unname(unlist(q[1]))
# edit: alternative to above
colnames(qt) <- q[1][[1]]

# convert result to data frame
qt <- as.data.frame(qt)

> qt
   t1 t1 t2 t2 t4
g1  0  2  1  3  4
g2  1  2  2  3  4
g3  2  2  3  3  4

不管是哪种,我希望这是用于演示而不是分析,因为在tidyverse中使用重复的列名真的很难。