只有部分列匹配时如何rbind
我有大约18个数据帧,基本上是列名称中存储的元素的频率计数。它们在Rptnames列中都有一些不同和相同的元素,所以它们看起来像这样 名为GroupedTableProportiondelAll的数据帧只有部分列匹配时如何rbind,r,R,我有大约18个数据帧,基本上是列名称中存储的元素的频率计数。它们在Rptnames列中都有一些不同和相同的元素,所以它们看起来像这样 名为GroupedTableProportiondelAll的数据帧 Rptname freq bob 4324234 jane 433 ham 4324 tim 22 dataframe called GroupedTableProportiondelLUAD Rptname fre
Rptname freq
bob 4324234
jane 433
ham 4324
tim 22
dataframe called GroupedTableProportiondelLUAD
Rptname freq
bob 987
jane 223
jonny 12
jim 98092
我正在尝试设置一个表,以便Rptname成为列,而每行都是频率。这样我就可以合并所有的数据帧
我试过以下方法
GroupedTableProportiondelAll_T <- as.data.frame(t(GroupedTableProportiondelAll))
GroupedTableProportiondelLUAD_T <- as.data.frame(t(GroupedTableProportiondelLUAD))
total <- rbind(GroupedTableProportiondelLUAD_T, GroupedTableProportiondelAll_T)
GroupedTableProportiondelAll\T在添加列以标识data.frame之后,可以首先rbind
数据帧。然后使用restrape2
软件包中的dcast
功能
rpt1
## Rptname freq df
## 1 bob 4324234 rpt1
## 2 jane 433 rpt1
## 3 ham 4324 rpt1
## 4 tim 22 rpt1
rpt2
## Rptname freq df
## 1 bob 987 rpt2
## 2 jane 223 rpt2
## 3 jonny 12 rpt2
## 4 jim 98092 rpt2
rpt1$df <- "rpt1"
rpt2$df <- "rpt2"
rpt <- rbind(rpt1, rpt2)
dcast(data = rpt, df ~ Rptname, value.var = "freq")
## df bob ham jane tim jim jonny
## 1 rpt1 4324234 4324 433 22 NA NA
## 2 rpt2 987 NA 223 NA 98092 12
rpt1
##Rptname频率df
##1 bob 4324234 rpt1
##2简433 rpt1
##3火腿4324 rpt1
##4 tim 22 rpt1
rpt2
##Rptname频率df
##1 bob 987 rpt2
##2简223 rpt2
##3 jonny 12 rpt2
##4吉姆98092 rpt2
rpt1$df一种替代rbind
+dcast
技术的方法,可以使用tidyverse
使用管道(%%>%%
)首先使用bind_rows()
将所有数据帧绑定在一起,同时创建一个数据帧id列(在本例中,我只调用了变量“df”)。然后使用spread()
将唯一的“Rptname”值移动为列名,并将“freq”值分散到新列中。在本例中,“Rptname”是键,“freq”是值
它看起来是这样的:
输入:
GTP_A
Rptname freq
1 bob 4324234
2 jane 433
3 ham 4324
4 tim 22
GTP_LUAD
Rptname freq
1 bob 987
2 jane 223
3 jonny 12
4 jim 98092
代码:
更新:
自2013年9月2019日tidyr 1.0.0发布之日起,spread()
和gather()
已失效,并分别被pivot\u Wither()
和pivot\u longer()
取代。Hadley Wickem表示,“spread()
和gather()
不会消失,但它们已经退役,这意味着它们不再处于积极开发中。”
为了获得与上述相同的输出,您现在需要首先按Rptname排列()
,然后使用pivot\u wider()
。如果不先排列,将获得类似的输出,但列顺序将与spread()
的输出不同
GroupTable%
排列(Rptname)%>%
枢轴(名称从=Rptname,值从=freq)
您应该将数据保留为长格式。这意味着您应该使用data.frame ID和rbind向每个data.frame添加一列。如果您坚持使用宽格式,您可以在以后使用Reformae2包中的dcast
,尽管这通常会使数据更难处理。因此,换句话说,我应该合并?这会用零填充空值吗?我在哪里提到了merge
?我想你可以用它…因为他们有很多数据帧,他们应该把它们放在一个列表中,然后做一些类似于DFlist的事情
GroupTable <- bind_rows(GTP_A,GTP_LUAD, .id = "df") %>%
spread(Rptname, freq)
GroupTable
df bob ham jane jim jonny tim
1 1 4324234 4324 433 NA NA 22
2 2 987 NA 223 98092 12 NA
GroupTable <- bind_rows(GTP_A, GTP_LUAD, .id = "df") %>%
arrange(Rptname) %>%
pivot_wider(names_from = Rptname, values_from = freq)