R 从两列创建成对数据帧
我有一些样本数据R 从两列创建成对数据帧,r,dataframe,R,Dataframe,我有一些样本数据 df = data.frame("cus" = c("cus1", "cus1", "cus1", "cus1", "cus2", "cus2", "cus2", "cus3", "cus3"), "prod"=c("prod1", "prod2", "prod3", "prod4", "prod5", "prod1", "prod2", "prod3", "prod4")) 我想创建一个新的数据帧,其中unique(df$cus)作为行名,unique(df$prod)
df = data.frame("cus" = c("cus1", "cus1", "cus1", "cus1", "cus2", "cus2", "cus2",
"cus3", "cus3"), "prod"=c("prod1", "prod2", "prod3", "prod4", "prod5", "prod1",
"prod2", "prod3", "prod4"))
我想创建一个新的数据帧,其中unique(df$cus)作为行名,unique(df$prod)作为列名。如果cusX-prodX组合在df中,则该值应为1,如果不在df中,则该值应为0。
所需的输出如下所示:
prod1 prod2 prod3 prod4 prod5
cus1 1 1 1 1 0
cus2 1 0 0 0 1
cus3 0 0 1 1 0
有人知道如何解决这个问题吗?
表
这样做:
> table(df)
prod
cus prod1 prod2 prod3 prod4 prod5
cus1 1 1 1 1 0
cus2 1 1 0 0 1
cus3 0 0 1 1 0
…但它本身并不返回data.frame
(而是返回类table
的矩阵)。如果您确实需要一个data.frame
,那么as.data.frame(table(df))
可以工作,但可能不是您想要的:
> as.data.frame(table(df))
cus prod Freq
1 cus1 prod1 1
2 cus2 prod1 1
3 cus3 prod1 0
4 cus1 prod2 1
…
这是因为执行这种转换通常更明智。要避免这样做,您需要取消设置表的类
:
result = as.data.frame(unclass(table(df)))
您可以这样做,一步就获得data.frame:
as.data.frame.matrix(table(df))
@Pierre:True,但通常不应该直接调用S3泛型。事实上,现在甚至在编写软件包时都不鼓励导出它们base
在这方面使用了过时的做法。