我需要从长到宽重塑具有非分类值的日期而不是相同数量的值。
数据框示例:
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
[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 "" "" "" ""