我想列出一个很长的data.frame。以下示例代码创建一个long data.frame,其中包含列" ID"," unit"和" mat"。使用dcast我想创建一个宽格式的data.frame,每个" mat"都有新的列,值应该是1(这个组合存在)或0(nope,not there ...)
df.long <- data.frame(ID = c(3, 4, 8, 9, 3, 4, 10, 3, 3, 4),
unit = c("cm", "cm", "m", "K", "cm", "cm", "m", "cm", "m", "cm"),
mat = c(1,1,1,1,2,2,2,3,3,3))
dcast(df.long, ID + unit ~ mat)
给我一个数据框,看起来如下:
ID unit 1 2 3
1 3 cm 1 2 3
2 3 m NA NA 3
3 4 cm 1 2 3
4 8 m 1 NA NA
5 9 K 1 NA NA
6 10 m NA 2 NA
要使表格填充为1和0(按计划),我现在找到的唯一方法是在long data.frame中添加一个额外的列并使用&#34; fun.aggregate = tabulate&#34;作为附加的dcast参数,即:
df.long <- data.frame(ID = c(3, 4, 8, 9, 3, 4, 10, 3, 3, 4),
unit = c("cm", "cm", "m", "K", "cm", "cm", "m", "cm", "m", "cm"),
mat = c(1,1,1,1,2,2,2,3,3,3),
value = c(1,1,1,1,1,1,1,1,1,1))
dcast(df.long, ID + unit ~ mat, fun.aggregate = tabulate)
ID unit 1 2 3
1 3 cm 1 1 1
2 3 m 0 0 1
3 4 cm 1 1 1
4 8 m 1 0 0
5 9 K 1 0 0
6 10 m 0 1 0
尽管它现在按预期工作,我想知道是否有人有更好的方法只使用dcast功能,而不改变初始data.frame。
答案 0 :(得分:2)
我认为这可以胜任:
dcast(df.long, ID + unit ~ mat,
fill = 0,
fun.aggregate = function(x) 1)
# ID unit 1 2 3
#1 3 cm 1 1 1
#2 3 m 0 0 1
#3 4 cm 1 1 1
#4 8 m 1 0 0
#5 9 K 1 0 0
#6 10 m 0 1 0
答案 1 :(得分:2)
Roland的方法绝对有效,但简单地将as.logical
用于聚合函数可能更有意义:
dcast(df.long, ID + unit ~ mat,
fill = 0,
fun.aggregate = as.logical,
value.var = "mat")
# ID unit 1 2 3
# 1 3 cm 1 1 1
# 2 3 m 0 0 1
# 3 4 cm 1 1 1
# 4 8 m 1 0 0
# 5 9 K 1 0 0
# 6 10 m 0 1 0
尝试as.logical(-1:3)
以了解转化为零的内容以及转换为内容的内容。