基于多个关键变量传播数据
Spread data based on multiple key variables
我的数据:
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
现在,我已经尝试使用 spread 和 dcast,但就是无法正常工作。
在我的真实数据集中有数千行,所以这只是示例数据。
这是使用 data.table
中的 dcast
的方法
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 重复。
我的数据:
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
现在,我已经尝试使用 spread 和 dcast,但就是无法正常工作。
在我的真实数据集中有数千行,所以这只是示例数据。
这是使用 data.table
dcast
的方法
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 重复。