本文介绍了Pivot_Wide融合排列的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我尝试按字母顺序对每一行进行排序(为了解决此问题Reshaping a dataframe in R by sorting just some fields in a row alphabetically:
这是数据帧:
df <- structure(list(ALT_1 = c("GAT", "TGC", "AGC", "T"), ALT_2 = c("CAG",
"TGA", "CGC", NA), ALT_3 = c("G", NA, "TGA", NA), ALT_4 = c("AGT",
NA, NA, NA)), class = "data.frame", row.names = c(NA, -4L))
ALT_1 ALT_2 ALT_3 ALT_4
1 GAT CAG G AGT
2 TGC TGA <NA> <NA>
3 AGC CGC TGA <NA>
4 T <NA> <NA> <NA>
预期输出:
ALT_1 ALT_2 ALT_3 ALT_4
1 AGT CAG G GAT
2 TGA TGC NA NA
3 AGC CGC TGA NA
4 T NA NA NA
为了实现这一点,我使用以下代码:
library(dplyr)
library(tidyr)
df %>%
mutate(id = row_number()) %>%
pivot_longer(
-id
) %>%
group_by(id) %>%
arrange(value, .by_group = TRUE) %>%
pivot_wider(
names_from = name,
values_from = value
)
并获得以下内容:
id ALT_4 ALT_2 ALT_3 ALT_1
<int> <chr> <chr> <chr> <chr>
1 1 AGT CAG G GAT
2 2 NA TGA NA TGC
3 3 NA CGC TGA AGC
4 4 NA NA NA T
我找到了问题所在:如果我在pivot_longer
之后停止并在分组后使用arrange
,则一切正常,如下所示:
但当我使用pivot_wider
旋转回枢轴时,顺序就消失了。如下所示:
原因是names_from
参数保持其原始顺序-&>此处name
我想知道arrange
安排的pivot_wider
之后的顺序是否有解决方案?
推荐答案
我们可以使用pmap
循环行,使用na.last = TRUE
library(purrr)
pmap_dfr(df, ~ setNames(sort(c(...), na.last =TRUE), names(df)))
-输出
# A tibble: 4 × 4
ALT_1 ALT_2 ALT_3 ALT_4
<chr> <chr> <chr> <chr>
1 AGT CAG G GAT
2 TGA TGC <NA> <NA>
3 AGC CGC TGA <NA>
4 T <NA> <NA> <NA>
如果要使用pivot_longer/pivot_wider
而不是arrange
,请在mutate
中使用sort
,因为arrange
不会破坏‘name’列的顺序。
library(dplyr)
library(tidyr)
df %>%
mutate(id = row_number()) %>%
pivot_longer(
-id
) %>%
group_by(id) %>%
mutate(value = sort(value, na.last = TRUE)) %>%
ungroup %>%
pivot_wider(
names_from = name,
values_from = value
) %>%
select(-id)
-输出
# A tibble: 4 × 4
ALT_1 ALT_2 ALT_3 ALT_4
<chr> <chr> <chr> <chr>
1 AGT CAG G GAT
2 TGA TGC <NA> <NA>
3 AGC CGC TGA <NA>
4 T <NA> <NA> <NA>
这篇关于Pivot_Wide融合排列的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!