我的数据:
df <- as.data.frame(cbind(Bilagstoptekst = c("A", "A", "A", "B", "B", "C", "D", "E", "E", "F", "F", "F", "F", "F"),
AKT=c("80", "80", "80", "80", "80", "25", "80", "80", "80", "80", "80", "25", "25", "80"),
IArt=c("HUVE", "HUVE", "HUVE", "HUVE", "HUBO", "BILÅ", "HUBO", "HUVE", "HUVE", "HUBO", "HUVE", "BILÅ", "BILÅ", "HUBO" ),
Belob=c(1,2,3,4,5,6,7,8,9,10,11,12,13,14)))
> df
Bilagstoptekst AKT IArt Belob
A 80 HUVE 1
A 80 HUVE 2
A 80 HUVE 3
B 80 HUVE 4
B 80 HUBO 5
C 25 BILÅ 6
D 80 HUBO 7
E 25 HUVE 8
E 80 HUVE 9
F 80 HUBO 10
F 80 HUVE 11
F 25 BILÅ 12
F 25 BILÅ 13
F 80 HUBO 14
现在,我想为Bilagstoptekst,AKT和IArt组合的每个键散布我的Belob列。
输出数据应如下所示:
Bilagstoptekst AKT IArt Belob1 Belob2 Belob3
A 80 HUVE 1 2 3
B 80 HUVE 4 NA NA
B 80 HUBO 5 NA NA
C 25 BILÅ 6 NA NA
D 80 HUBO 7 NA NA
E 80 HUVE 8 9 NA
F 80 HUBO 10 14 NA
F 80 HUVE 11 NA NA
F 25 BILÅ 12 13 NA
现在,我已经尝试了传播和dcast,但我无法使其正常工作。
在我的真实数据集中,我有数千行,所以这只是示例数据。
答案 0 :(得分:2)
这是使用dcast
中的data.table
的一种方式
library(data.table)
dt <- as.data.table(df)
dt[, idx := rowid(Bilagstoptekst, AKT, IArt)] # creates the timevar
out <- dcast(dt,
Bilagstoptekst + AKT + IArt ~ paste0("Belob", idx),
value.var = "Belob")
out
# Bilagstoptekst AKT IArt Belob1 Belob2 Belob3
#1: A 80 HUVE 1 2 3
#2: B 80 HUBO 5 <NA> <NA>
#3: B 80 HUVE 4 <NA> <NA>
#4: C 25 BILÅ 6 <NA> <NA>
#5: D 80 HUBO 7 <NA> <NA>
#6: E 80 HUVE 8 9 <NA>
#7: F 25 BILÅ 12 13 <NA>
#8: F 80 HUBO 10 14 <NA>
#9: F 80 HUVE 11 <NA> <NA>
这里重要的是我们创建的列idx
,当我们调整数据的形状时,它用作“ timevar”。
在base R
中,您需要做
df$idx <- with(df, ave(Belob, Bilagstoptekst, AKT, IArt, FUN = seq_along))
reshape(df, idvar = c("Bilagstoptekst", "AKT", "IArt"), timevar = "idx", direction = "wide")
tidyverse
方法是一种练习;)
不确定您的问题是否与Transpose / reshape dataframe without “timevar” from long to wide format重复。