重塑2 dcast-fun.aggregate表格中的值

重塑2 dcast-fun.aggregate表格中的值,r,reshape2,R,Reshape2,我想将一个较长的data.frame制成表格。下面的示例代码创建了一个长data.frame,其中包含“ID”、“unit”和“mat”列。使用dcast,我想创建一个宽格式的data.frame,每个“mat”都有新的列,值应该是1(这个组合存在)或0(不存在,不存在…) 要使用1和0(按计划)填充表格,我现在找到的唯一方法是在long data.frame中添加一个额外的列,并使用“fun.aggregate=tablete”作为额外的dcast参数,即: df.long <- dat

我想将一个较长的data.frame制成表格。下面的示例代码创建了一个长data.frame,其中包含“ID”、“unit”和“mat”列。使用dcast,我想创建一个宽格式的data.frame,每个“mat”都有新的列,值应该是1(这个组合存在)或0(不存在,不存在…)

要使用1和0(按计划)填充表格,我现在找到的唯一方法是在long data.frame中添加一个额外的列,并使用“fun.aggregate=tablete”作为额外的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

df.long我想这就行了:

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

我认为这就是工作:

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

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)
转换为0,以及将什么转换为1。罗兰的方法确实有效,但简单地将
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)
来了解什么被转换为零,什么被转换为一。

尽管我不完全理解fun.aggregate参数的语法,但这个解决方案工作得非常好!谢谢注:字符串“function(x)1”是不是一个快捷的有趣版本?如果你的表达式只有一行代码,你就不需要大括号了<代码>乐趣。聚合
需要一个函数。这也可以是一个匿名函数(动态定义)。尽管我不完全理解fun.aggregate参数的语法,但这个解决方案工作得非常好!谢谢注:字符串“function(x)1”是不是一个快捷的有趣版本?如果你的表达式只有一行代码,你就不需要大括号了<代码>乐趣。聚合需要一个函数。这也可以是一个匿名函数(动态定义)。这对于
df.long
中的零值可能有意义,但从描述来看,我假设这些值应该在相同的结果旁边指示为存在(即
1
),这种方法更符合我的逻辑,即为“它存在”分配一些值(1),并且(0)对于nope,即true false。但是,两个dcast解决方案都需要
fill=0
语句,尽管在具有
fun.aggregate=as.logical
的解决方案中,我希望此功能是内在的。@PJussel fill中的默认选项是
NA
,必须更改此选项对于零值可能有意义在
df.long
中,但从描述来看,我认为除了相同的结果之外,这些应该被表示为存在(即
1
),这种方法更符合我的逻辑,即为“它存在”和(0)分配一些值(1)对于nope,即true false。但是,两个dcast解决方案都需要
fill=0
语句,尽管在带有
fun.aggregate=as.logical
的解决方案中,我希望此功能是内在的。@PJussel fill中的默认选项是
NA
,必须更改