R语言 将长数据集列表转置为单个宽数据集

fruv7luv  于 2023-05-11  发布在  其他
关注(0)|答案(4)|浏览(149)

我有一个长数据集的列表Counts_L,长度为65,如下所示:
计数_L1
| 频率|Idx_names|
| --------------|--------------|
| 一百|一个|
| 两百|B|
| 三百|C类|
计数_L2
| 频率|Idx_names|
| --------------|--------------|
| 一百五十|一个|
| 二千年|C类|
我想把它变成一个宽数据集Counts_W,有65行,每个数据集对应一个原始Counts_L:
计数_W:
| 频率_A|频率_B|频率_C|
| --------------|--------------|--------------|
| 一百|两百|三百|
| 一百五十|0|二千年|
我想写一个函数来识别丢失的“Idx_names”,并将其填充为零“Freq”值,然后使用“map”以某种方式将其扩展到列表中的所有数据集,然后合并它们,但到目前为止还没有成功。任何帮助都很感激。

vs91vp4v

vs91vp4v1#

您可以将所有数据集合并为一个数据集,并以宽格式获得它。

library(dplyr)
library(tidyr)

bind_rows(Counts_L, .id = "id") %>%
  pivot_wider(names_from = Idx_names, values_from = Freq, 
              names_prefix = "Freq_", values_fill = 0) %>%
  select(-id)

#  Freq_A Freq_B Freq_C
#   <int>  <int>  <int>
#1    100    200    300
#2    150      0   2000

这里的id变量为Counts_L列表中的每个 Dataframe 创建一个唯一的编号。

bind_rows(Counts_L, .id = "id")

#  id Freq Idx_names
#1  1  100         A
#2  1  200         B
#3  1  300         C
#4  2  150         A
#5  2 2000         C

数据

如果在reproducible format中提供数据,则更容易提供帮助

Counts_L <- list(structure(list(Freq = c(100L, 200L, 300L), Idx_names = c("A", 
"B", "C")), row.names = c(NA, -3L), class = "data.frame"), structure(list(
    Freq = c(150L, 2000L), Idx_names = c("A", "C")), row.names = c(NA, 
-2L), class = "data.frame"))
ru9i0ody

ru9i0ody2#

一个选项是在每个表上执行pivot_wider,然后执行bind_rows。然后,看起来你想用0填充缺失值,这样你就可以使用mutate(across())在所有内容上运行replace_na

library(tidyverse)

counts_l <- list(
  data.frame(freq = c(100, 200, 300), idx_names = LETTERS[1:3]),
  data.frame(freq = c(150, 2000), idx_names = c("A", "C"))
)

counts_l %>% 
  map(\(x)x %>% pivot_wider(names_from = idx_names, values_from = freq, names_prefix = "freq_")) %>% 
  bind_rows() %>% 
  mutate(across(everything(), \(x) replace_na(x, 0)))
#> # A tibble: 2 × 3
#>   freq_A freq_B freq_C
#>    <dbl>  <dbl>  <dbl>
#> 1    100    200    300
#> 2    150      0   2000

创建于2023-05-09,使用reprex v2.0.2

smdncfj3

smdncfj33#

tidyverse解决方案,其中tibble::deframe() + purrr::map_dfr()

library(tidyverse)

Counts_L %>%
  map_dfr(~ deframe(select(.x, 2:1))) %>%
  mutate(across(everything(), ~ replace_na(.x, 0), .names = 'Freq_{.col}'), .keep = "unused")

# # A tibble: 2 × 3
#   Freq_A Freq_B Freq_C
#    <dbl>  <dbl>  <dbl>
# 1    100    200    300
# 2    150      0   2000
wj8zmpe1

wj8zmpe14#

使用dcast

library(data.table)
 dcast(rbindlist(Counts_L, idcol = "id"), id 
  ~ paste0("Freq_", Idx_names), value.var = "Freq", fill = 0)[,-1]
   Freq_A Freq_B Freq_C
1:    100    200    300
2:    150      0   2000

相关问题