我有一个这样的数据框:
Name Position Value
a 1 0.2
a 3 0.4
a 4 0.3
b 1 0.5
b 2 0.4
b 5 0.3
c 2 0.3
c 3 0.4
c 5 0.1
d 1 0.2
d 2 0.4
d 3 0.5
我想使每个“名称”的位置始终从1到5,然后将NA填充为“值”,如下所示:
Name Position Value
a 1 0.2
a 2 NA
a 3 0.4
a 4 0.3
a 5 NA
b 1 0.5
b 2 0.4
b 3 NA
b 4 NA
b 5 0.3
c 1 NA
c 2 0.3
c 3 0.4
c 4 NA
c 5 0.1
d 1 0.2
d 2 0.4
d 3 0.5
d 4 NA
d 5 NA
有没有一种方法可以在不创建前两列的虚拟数据帧,然后通过合并进行某种外部联接的情况下做到这一点?
谢谢。
最佳答案
您可以使用reshape2
包:
# make sample data frame
df <- read.table(text = "Name Position Value
a 1 0.2
a 3 0.4
a 4 0.3
b 1 0.5
b 2 0.4
b 5 0.3
c 2 0.3
c 3 0.4
c 5 0.1
d 1 0.2
d 2 0.4
d 3 0.5", header = TRUE, stringsAsFactors = FALSE)
library('reshape2')
df2 <- dcast(df, Name ~ Position)
df3 <- melt(df2, value.name = "Value", variable.name = "Position")
df3[order(df3$Name), ]
# Name Position Value
# 1 a 1 0.2
# 5 a 2 NA
# 9 a 3 0.4
# 13 a 4 0.3
# 17 a 5 NA
# 2 b 1 0.5
# 6 b 2 0.4
# 10 b 3 NA
# 14 b 4 NA
# 18 b 5 0.3
# 3 c 1 NA
# 7 c 2 0.3
# 11 c 3 0.4
# 15 c 4 NA
# 19 c 5 0.1
# 4 d 1 0.2
# 8 d 2 0.4
# 12 d 3 0.5
# 16 d 4 NA
# 20 d 5 NA