首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在R中“熔化”行wise而不是列wise?

如何在R中“熔化”行wise而不是列wise?
EN

Stack Overflow用户
提问于 2016-08-26 14:47:21
回答 3查看 2.2K关注 0票数 1

我有一个数据框架A,我希望用行分组代替列wise,使其看起来像B (这也不包括带有NA的观察结果)。这能用“熔融”功能来实现吗?

代码语言:javascript
复制
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技能。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-08-26 14:49:25

我们可以在order之后使用melt

代码语言:javascript
复制
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

代码语言:javascript
复制
`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
票数 4
EN

Stack Overflow用户

发布于 2016-08-26 14:58:50

从潮间带,融化->总结了->的不巢

代码语言:javascript
复制
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方法:

代码语言:javascript
复制
melt(A, id=c("Id1", "Id2"), na.rm=TRUE)[-3]
票数 5
EN

Stack Overflow用户

发布于 2016-08-26 15:02:57

您可以将dplyr与来自tidyr包的gather一起使用:

代码语言:javascript
复制
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列将包含所收集的列的名称,我们在最终结果中不需要这些名称。收集完之后,filterNewVar中取出NA行。然后按照ID1进行排序,然后是ID2,然后删除Key列。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39169052

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档