如何";熔化;在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='')