我简化了上一个问题。不便之处敬请原谅。
如何通过保留标题名称来转置表。我也无法使用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
答案 0 :(得分:1)
如果你想创造&#34; t#&#34;使用spread
包中的tidyr
命名列,请注意它按字母顺序排列,&amp;并不能很好地处理重复的列名。
您的示例有两行名为&#34; t1&#34; &安培;两行命名为&#34; t2&#34;。所以需要处理。
在此示例中,的名称 按字母顺序排列,但假设并非总是如此,您可以在运行顺序中使用一系列数字作为名称前缀。< / p>
可以修改以下内容以便工作: 或者,如果您不需要 不管是哪种,我希望这是用于演示而不是分析,因为在tidyverse中使用重复的列名真的很难。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