当只有某些列匹配时如何进行 rbind

Seb*_*eki 4 r

我有大约 18 个数据帧,它们本质上是存储在 Rptnames 列中的元素的频率计数。它们在 Rptnames 列中都有一些不同的元素和一些相同的元素,所以它们看起来像这样

名为 GroupedTableProportiondelAll 的数据框

Rptname    freq

bob         4324234
jane        433
ham        4324
tim         22

dataframe called GroupedTableProportiondelLUAD

Rptname     freq

bob          987
jane         223
jonny        12
jim          98092
Run Code Online (Sandbox Code Playgroud)

我试图建立一个表格,以便 Rptname 成为列,每一行都是频率。这样我就可以组合所有数据帧。

我已经尝试了以下

   GroupedTableProportiondelAll_T <- as.data.frame(t(GroupedTableProportiondelAll))
    GroupedTableProportiondelLUAD_T <- as.data.frame(t(GroupedTableProportiondelLUAD))

   total <- rbind(GroupedTableProportiondelLUAD_T, GroupedTableProportiondelAll_T)
Run Code Online (Sandbox Code Playgroud)

但我收到错误 Error in rbind(deparse.level, ...) : numbers of columns of arguments are not match

所以问题是 a) 我怎么能做 rbind (我想 cbind 也可以不用转置),这样绑定就可以发生而无需匹配。
b) 在这里合并会更好 c) 有没有办法为空值输入零 d) P'raps 有更好的方法来做到这一点,比如我不太熟悉的矩阵?我知道它的 4 个问题,但中心问题是相同的 - 当并非所有行或列都匹配时如何绑定

Lau*_*ert 5

使用 tidyverse的rbind+dcast技术的替代方法。

首先使用管道 ( %>%)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
Run Code Online (Sandbox Code Playgroud)

代码:

GroupTable <- bind_rows(GTP_A,GTP_LUAD, .id = "df") %>%
  spread(Rptname, freq)
Run Code Online (Sandbox Code Playgroud)

输出:

GroupTable
df     bob  ham jane   jim jonny tim
1  1 4324234 4324  433    NA    NA  22
2  2     987   NA  223 98092    12  NA
Run Code Online (Sandbox Code Playgroud)

更新:截至 2019 年 9 月 13 日 tidyr 1.0.0 发布spread()gather()已分别退役并由pivot_wider()和取代pivot_longer()。从发行说明中Hadley Wickem 指出“spread()并且gather()不会消失,但它们已经退役,这意味着它们不再处于积极开发状态。”

为了获得与上述相同的输出,您现在需要首先arrange()通过 Rptname 然后使用pivot_wider(). 如果您不先安排,您将获得类似的输出,但列顺序将与spread().

GroupTable <- bind_rows(GTP_A, GTP_LUAD, .id = "df") %>%
  arrange(Rptname) %>% 
  pivot_wider(names_from = Rptname, values_from = freq)
Run Code Online (Sandbox Code Playgroud)