[英]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.