简体   繁体   English

如何转换具有相同列名的数据框

[英]How to transform a data frame with identical column names

I have a df like:我有一个像这样的df:

df <- data.frame( name = c("mouse", "rat"), cont = c(27L, 83L), cont = c(43L, 45L), cont = c(18L, 54L), 
treat = c(49040L, 53522L), treat = c(48570L, 22235L), treat = c(138888L, 345667L))

name   cont cont cont treat  treat  treat
mouse   27   43  18   49040  48570  138888
rat     83   45  54   53522  22235  345667 

I performed melt function by meltData <- melt(df) on the df but I get all row same, I mean:我在df上通过meltData <- melt(df)执行了melt function 但我得到的所有行都相同,我的意思是:

variable value
 cont      27
 cont      83
 cont      27
 cont      83
 treat     49040
 treat     53522  
 treat     49040
 treat     53522
        .
        .
        .

desired output should be:所需的 output 应该是:

variable value
 cont      27
 cont      83
 cont      43
 cont      45
 treat     49040
 treat     53522  
 treat     48570
 treat     22235
        .
        .
        .

I tried different ways of melting but couldn't figure out what I'm missing.我尝试了不同的融化方式,但无法弄清楚我错过了什么。 Any help would be appreciated.任何帮助,将不胜感激。

You can use data.table::melt() instead:您可以使用data.table::melt()代替:

library(data.table)
setDT(df)
melt(df, id.vars = "name")[, variable := sub("\\..+", "", variable)
                           ][, !"name"]

    variable  value
 1:     cont     27
 2:     cont     83
 3:     cont     43
 4:     cont     45
 5:     cont     18
 6:     cont     54
 7:    treat  49040
 8:    treat  53522
 9:    treat  48570
10:    treat  22235
11:    treat 138888
12:    treat 345667

Or stack() from base R:或来自基础 R 的stack()

dfl <- stack(df[-1])
dfl$ind <- sub("\\..+", "", dfl$ind)
dfl
   values   ind
1      27  cont
2      83  cont
3      43  cont
4      45  cont
5      18  cont
6      54  cont
7   49040 treat
8   53522 treat
9   48570 treat
10  22235 treat
11 138888 treat
12 345667 treat

Data数据

df <- data.frame(
  name = c("mouse", "rat"), 
  cont = c(27L, 83L), 
  cont = c(43L, 45L), 
  cont = c(18L, 54L), 
  treat = c(49040L, 53522L), 
  treat = c(48570L, 22235L), 
  treat = c(138888L, 345667L)
)

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM