繁体   English   中英

使用基于 R 中的值的列重塑 dataframe

[英]Reshape a dataframe with columns based on values in R

我有一个具有这种结构的df:

q1_1 q1_2 q1_3 q2_1 q2_2 q2_3
1    2    3    1    3    4
1    3         1    2    3  
1    4         2  

并想将数据转换为这种结构

    Brand_1  Brand_2 Brand_3 Brand_4
q1  3        1      2        1
q2  2        2      2        1 

所以基本上我正在重塑数据,但根据值的计数创建列,所以在这个例子中,我需要一个名为 Brand_1 的列,它计算 q1 和 q2 的出现次数为 1。 我已经能够重塑数据,但不知道如何根据值处理列名。

这是否有效:

library(dplyr)
library(tidyr)
library(stringr)
df %>% 
   mutate(across(everything(), ~ recode(., `1` = 'Brand_1', `2` = 'Brand_2', `3` = 'Brand_3', `4` = 'Brand_4'))) %>% 
     pivot_longer(cols = everything()) %>% mutate(name = str_extract(name, 'q\\d')) %>% count(name,value) %>% na.omit() %>% 
       pivot_wider(id_cols = name, names_from = value, values_from = n)
# A tibble: 2 x 5
  name  Brand_1 Brand_2 Brand_3 Brand_4
  <chr>   <int>   <int>   <int>   <int>
1 q1          3       1       2       1
2 q2          2       2       2       1

data.table解决方案

library( data.table )
DT <- fread("q1_1 q1_2 q1_3 q2_1 q2_2 q2_3
1    2    3    1    3    4
1    3    NA     1    2    3  
1    4    NA     2  NA NA")

#melt to long format
ans <- melt( DT, measure.vars = names(DT), na.rm = TRUE )
#summarise while casting to wide
dcast( ans, gsub("(^q[0-9]).*", "\\1", variable) ~ 
         paste0("Brand_", value), fun.aggregate = length )

#    variable Brand_1 Brand_2 Brand_3 Brand_4
# 1:       q1       3       1       2       1
# 2:       q2       2       2       2       1

做这个

library(tidyverse)

df %>% pivot_longer(everything(), names_to = "Brand", values_to = "Brand_no") %>%
  filter(!is.na(Brand_no)) %>%
  mutate(Brand = str_extract(Brand, ".*(?=_)"),
         Brand_no = paste("Brand", Brand_no, sep = "_")) %>%
  count(Brand, Brand_no) %>%
  pivot_wider(id_cols = Brand, names_from = Brand_no, values_from = n, values_fill = 0)

# A tibble: 2 x 5
  Brand Brand_1 Brand_2 Brand_3 Brand_4
  <chr>   <int>   <int>   <int>   <int>
1 q1          3       1       2       1
2 q2          2       2       2       1

使用的输入

df <- structure(list(q1_1 = c(1L, 1L, 1L), q1_2 = 2:4, q1_3 = c(3L, 
NA, NA), q2_1 = c(1L, 1L, 2L), q2_2 = c(3L, 2L, NA), q2_3 = c(4L, 
3L, NA)), class = "data.frame", row.names = c(NA, -3L))

> df
  q1_1 q1_2 q1_3 q2_1 q2_2 q2_3
1    1    2    3    1    3    4
2    1    3   NA    1    2    3
3    1    4   NA    2   NA   NA

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM