将非分类值从长整形为宽整型

问题描述 投票:0回答:2

我需要从长到宽重塑具有非分类值的日期而不是相同数量的值。

数据框示例:

df_long <- as.data.frame(cbind(c("id A",  "b",    "b",    "d",    "d","id B", "kh",   "kk",   "ip", "id C", "99", "id D", "id E"),c(1,1,1,1,1, 2,2,2,2,3,3,1,1)))

我需要这个:

df_wide <- as.data.frame(rbind(c("id A", "b", "b", "d", "d"), c("id B", "kh", "kk", "ip", ""), c("id C", "99", "", "", ""), c("id D", "", "", "", ""), c("id E", "", "", "", "")))

我不知道如何重塑它,因为值不是分类的,并且并非每个id都具有相同数量的值。

因此,我想知道如何从长到宽以及从宽到长重塑此类数据。

谢谢您的帮助!

r reshape2 data-transform
2个回答
0
投票

您可以做:

a = aggregate(V1~V2,transform(df_long,V2 = cumsum(grepl("id",V1))),paste,collapse=',')[,2]
read.csv(text=a,header = FALSE,fill = TRUE)
    V1 V2 V3 V4 V5
1 id A  b  b  d  d
2 id B kh kk ip   
3 id C 99         
4 id D            
5 id E   

0
投票

[A tidyverse选项

library(tidyverse)
df_long %>%
    separate(V1, into = c("id", "val"), fill = "left") %>%
    select(-V2) %>%
    mutate(row = cumsum(!is.na(id))) %>%
    fill(id) %>%
    group_by(row) %>%
    mutate(col = 1:n()) %>%
    ungroup() %>% 
    pivot_wider(
        id_cols = c(row, id), 
        names_from = col, 
        names_prefix = "V",
        values_from = val,
        values_fill = list(val = ""))
## A tibble: 5 x 7
#    row id    V1    V2    V3    V4    V5
#  <int> <chr> <chr> <chr> <chr> <chr> <chr>
#1     1 id    A     b     b     d     d
#2     2 id    B     kh    kk    ip    ""
#3     3 id    C     99    ""    ""    ""
#4     4 id    D     ""    ""    ""    ""
#5     5 id    E     ""    ""    ""    ""
© www.soinside.com 2019 - 2024. All rights reserved.