我有大约 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 个问题,但中心问题是相同的 - 当并非所有行或列都匹配时如何绑定
使用 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)
| 归档时间: |
|
| 查看次数: |
21290 次 |
| 最近记录: |