繁体   English   中英

重塑非分类价值

[英]reshape from long to wide of non-categorical values

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

数据框的示例:

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都具有相同数量的值。

因此,我想知道是否要从长到宽以及从宽到长重新整形此类数据。

谢谢您的帮助!

您可以这样做:

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   

由于您需要将其变回原样,因此您应该执行以下操作:

 f<-read.csv(text = with(df_long,tapply(V1,cumsum(grepl("id",V1)),paste0,collapse=",")), 
              header = FALSE, fill = TRUE,stringsAsFactors = F,na.strings = "")


 print(f,na = "")
    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

现在,将其转换回long_data,您可以执行以下操作:

with(g <- transform(stack(f),ind = c(row(f))),na.omit(g[order(ind),]))
   values ind
1    id A   1
6       b   1
11      b   1
16      d   1
21      d   1
2    id B   2
7      kh   2
12     kk   2
17     ip   2
3    id C   3
8      99   3
4    id D   4
5    id E   5

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     ""    ""    ""    ""

PS。 似乎df_long$V2中未使用列df_long$V2中的df_wide 那是对的吗?

暂无
暂无

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

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