我有一个数据框架A,我希望用行分组代替列wise,使其看起来像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)我发现了一个类似的问题的answer,但是这个函数看起来太过分了,超出了我目前的R技能。
发布于 2016-08-26 14:49:25
我们可以在order之后使用melt
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或者我们可以通过复制来扩展“Id”列的“A”行,以及连接非Id列的转置的base R。
`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发布于 2016-08-26 14:58:50
从潮间带,融化->总结了->的不巢
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编辑
因为melt有一个NA删除参数(信用:@Frank),那么一个一行就可以了。注意:这一行是reshape2版本的akrun的data.table方法:
melt(A, id=c("Id1", "Id2"), na.rm=TRUE)[-3]发布于 2016-08-26 15:02:57
您可以将dplyr与来自tidyr包的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列中的行中。Key列将包含所收集的列的名称,我们在最终结果中不需要这些名称。收集完之后,filter在NewVar中取出NA行。然后按照ID1进行排序,然后是ID2,然后删除Key列。
https://stackoverflow.com/questions/39169052
复制相似问题