R语言 将长数据转化为宽使用频率

nxagd54h  于 2023-02-01  发布在  其他
关注(0)|答案(3)|浏览(152)

我想知道下表中转换数据的实用方法

dat <- data.frame('city' = c('A','A','B','C','A','B','B','C','C','C'), 
                  'color' = c('red', 'green', 'blue', 'red', 'green', 'blue', 'green', 'blue', 'red', 'red'),
                  'sex' = c('M','F','F','M','F','F','F','M','F','M'))

city red green blue F M
A    1   2     0    2 1
B    0   1     2    3 0
C    3   0     1    1 3
0g0grzrc

0g0grzrc1#

使用tidyr,您可以先使用pivot_longer,然后使用pivot_wider

library(tidyr)

dat %>%
  pivot_longer(c(color, sex), values_transform = as.factor) %>%
  pivot_wider(id_cols = city, names_from = value, names_sort = TRUE,
              values_from = value, values_fn = length, values_fill = 0)

# # A tibble: 3 × 6
#   city   blue green   red     F     M
#   <chr> <int> <int> <int> <int> <int>
# 1 A         0     2     1     2     1
# 2 B         2     1     0     3     0
# 3 C         1     0     3     1     3
  • values_transform = as.factornames_sort = TRUE是对列名进行排序的技巧。

base解决方案:

as.data.frame.matrix(table(cbind(dat[1], Reduce(c, lapply(dat[-1], factor)))))

#   blue green red F M
# A    0     2   1 2 1
# B    2     1   0 3 0
# C    1     0   3 1 3
carvr3hs

carvr3hs2#

使用sapply,创建多个tablebind

sapply(dat[2:3], \(x) as.data.frame.matrix(table(dat$city, x))) |>
  do.call(what = 'cbind.data.frame')

  color.blue color.green color.red sex.F sex.M
A          0           2         1     2     1
B          2           1         0     3     0
C          1           0         3     1     3
4ioopgfo

4ioopgfo3#

你可以先转换成更长的格式,然后计算每组的值,再使用pivot_wider转换回更宽的格式,如下所示:

library(dplyr)
library(tidyr)
dat %>%
  pivot_longer(cols = c(color, sex)) %>%
  group_by(city) %>%
  add_count(value) %>%
  distinct() %>%
  select(-name) %>%
  pivot_wider(names_from = value, values_from = n, values_fill = 0)
#> # A tibble: 3 × 6
#> # Groups:   city [3]
#>   city    red     M green     F  blue
#>   <chr> <int> <int> <int> <int> <int>
#> 1 A         1     1     2     2     0
#> 2 B         0     0     1     3     2
#> 3 C         3     3     0     1     1

创建于2023年1月31日,使用reprex v2.0.2

相关问题