如何";熔化;在R中按行而不是按列?

如何";熔化;在R中按行而不是按列?,r,dataframe,melt,R,Dataframe,Melt,我有一个数据框a,我想将其按行而不是按列进行分解,使其看起来像B(这也排除了含有NA的观察值)。这可以通过“熔化”功能实现吗 A <- read.table(text=" Id1 Id2 Var1 Var2 Var3 1 1 1 2 NA 1 2 NA 3 4 1 3 5 6 7 ", header=T) B <- read.t

我有一个数据框
a
,我想将其按行而不是按列进行分解,使其看起来像
B
(这也排除了含有
NA
的观察值)。这可以通过“熔化”功能实现吗

A <- read.table(text="  Id1 Id2 Var1    Var2    Var3    
            1   1   1   2   NA  
            1   2   NA  3   4   
            1   3   5   6   7   ", header=T)


B <- read.table(text="  Id1 Id2 NewVar  
    1   1   1   
    1   1   2   
    1   2   3   
    1   2   4   
    1   3   5   
    1   3   6   
    1   3   7   ", header=T)

A我们可以在
融化后
订购

library(data.table)
melt(setDT(A), id.var = c("Id1", "Id2"), na.rm = TRUE, value.name = "NewVar"
     )[order(Id1, Id2)][, variable := NULL][]
#   Id1 Id2 NewVar
#1:   1   1     1
#2:   1   1     2
#3:   1   2     3
#4:   1   2     4
#5:   1   3     5
#6:   1   3     6
#7:   1   3     7

或者我们可以使用
base R
通过复制来扩展'Id'列的'A'行,以及
cbind
与非Id列的转置进行连接

`row.names<-`(na.omit(data.frame(A[rep(1:nrow(A), each =3), 1:2], 
                    NewVar= c(t(A[-(1:2)])))), NULL)
#  Id1 Id2 NewVar
#1   1   1      1
#2   1   1      2
#3   1   2      3
#4   1   2      4
#5   1   3      5
#6   1   3      6
#7   1   3      7

`row.names我们可以在
融化后
订购

library(data.table)
melt(setDT(A), id.var = c("Id1", "Id2"), na.rm = TRUE, value.name = "NewVar"
     )[order(Id1, Id2)][, variable := NULL][]
#   Id1 Id2 NewVar
#1:   1   1     1
#2:   1   1     2
#3:   1   2     3
#4:   1   2     4
#5:   1   3     5
#6:   1   3     6
#7:   1   3     7

或者我们可以使用
base R
通过复制来扩展'Id'列的'A'行,以及
cbind
与非Id列的转置进行连接

`row.names<-`(na.omit(data.frame(A[rep(1:nrow(A), each =3), 1:2], 
                    NewVar= c(t(A[-(1:2)])))), NULL)
#  Id1 Id2 NewVar
#1   1   1      1
#2   1   1      2
#3   1   2      3
#4   1   2      4
#5   1   3      5
#6   1   3      6
#7   1   3      7

`row.names来自tidyverse,melt->summary->unnest

library(reshape2)
library(tidyr)
melt(A, id=c("Id1", "Id2")) %>% group_by(Id1, Id2) %>%
  summarise(value=list(value[!is.na(value)])) %>% unnest()
# Source: local data frame [7 x 3]
# Groups: Id1 [1]
# 
#     Id1   Id2 value
#   <int> <int> <int>
# 1     1     1     1
# 2     1     1     2
# 3     1     2     3
# 4     1     2     4
# 5     1     3     5
# 6     1     3     6
# 7     1     3     7

在tidyverse中,熔化->总结->不耐烦

library(reshape2)
library(tidyr)
melt(A, id=c("Id1", "Id2")) %>% group_by(Id1, Id2) %>%
  summarise(value=list(value[!is.na(value)])) %>% unnest()
# Source: local data frame [7 x 3]
# Groups: Id1 [1]
# 
#     Id1   Id2 value
#   <int> <int> <int>
# 1     1     1     1
# 2     1     1     2
# 3     1     2     3
# 4     1     2     4
# 5     1     3     5
# 6     1     3     6
# 7     1     3     7

您可以使用
tidyr
软件包中的
dplyr
gather

library(dplyr)
library(tidyr)
A %>% gather(Key,NewVar,Var1:Var3) %>% 
      filter(!is.na(NewVar)) %>% 
      arrange(Id1,Id2) %>% select(-Key)
##  Id1 Id2 NewVar
##1   1   1      1
##2   1   1      2
##3   1   2      3
##4   1   2      4
##5   1   3      5
##6   1   3      6
##7   1   3      7

这将把列
Var1:Var3
收集到
NewVar
列中的行中。
列将包含收集的列的名称,我们在最终结果中不需要这些名称。收集后,
过滤出
NewVar
中的
NA
行。然后按
ID1
排序,然后按
ID2
排序,并删除
列。

您可以使用
dplyr
tidyr
包中收集

library(dplyr)
library(tidyr)
A %>% gather(Key,NewVar,Var1:Var3) %>% 
      filter(!is.na(NewVar)) %>% 
      arrange(Id1,Id2) %>% select(-Key)
##  Id1 Id2 NewVar
##1   1   1      1
##2   1   1      2
##3   1   2      3
##4   1   2      4
##5   1   3      5
##6   1   3      6
##7   1   3      7

这将把列
Var1:Var3
收集到
NewVar
列中的行中。
列将包含收集的列的名称,我们在最终结果中不需要这些名称。收集后,
过滤出
NewVar
中的
NA
行。然后按
ID1
排序,然后按
ID2
排序,并删除
列。

我不明白,这个问题不只是一个带有小格式的基本重塑吗<代码>重塑(A,dir='long',variable=3:5,sep='')
<代码>重塑(A,dir='long',variable=3:5,sep='')