Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/79.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用cast或其他函数在R中创建二进制表_R_Dataframe_Casting_Reshape - Fatal编程技术网

如何使用cast或其他函数在R中创建二进制表

如何使用cast或其他函数在R中创建二进制表,r,dataframe,casting,reshape,R,Dataframe,Casting,Reshape,我正在尝试创建一个具有二进制响应且一直在使用cast的因素列表 DF2 <- cast(data.frame(DM), id ~ region) names(DF2)[-1] <- paste("region", names(DF2)[-1], sep = "") 我想要的是: id region1 region2 region3 1 0 1 1 2 0 1 0 3 1 0 0 我有点喜欢d

我正在尝试创建一个具有二进制响应且一直在使用cast的因素列表

DF2 <- cast(data.frame(DM), id ~ region)
names(DF2)[-1] <- paste("region", names(DF2)[-1], sep = "")
我想要的是:

id region1 region2 region3
1   0          1     1
2   0          1     0
3   1          0     0

我有点喜欢
dcast
来自重塑2

library(reshape2)
dat <- read.table(text = "id region
 1   2
 1   3
 2   2
 3   1
 3   1",header = TRUE,sep = "")

dcast(dat,id~region,fun.aggregate = function(x){as.integer(length(x) > 0)})

  id 1 2 3
1  1 0 1 1
2  2 0 1 0
3  3 1 0 0
library(重塑2)
dat(0)})
id 1 2 3
1  1 0 1 1
2  2 0 1 0
3  3 1 0 0

也许有一种更为流畅的方法可以做到这一点,但老实说,我并不经常使用强制转换功能。

不需要专门的函数:

x <- data.frame(id=1:4, region=factor(c(3,2,1,2)))
x
   id region
1  1      3
2  2      2
3  3      1
4  4      2

x.bin <- data.frame(x$id, sapply(levels(x$region), `==`, x$region))
names(x.bin) <- c("id", paste("region", levels(x$region),sep=''))
x.bin

  id region1 region2 region3
1  1   FALSE   FALSE    TRUE
2  2   FALSE    TRUE   FALSE
3  3    TRUE   FALSE   FALSE
4  4   FALSE    TRUE   FALSE
x原始数据:

x <- data.frame(id=c(1,1,2,3,3), region=factor(c(2,3,2,1,1)))

> x
  id region
1  1      2
2  1      3
3  2      2
4  3      1
5  3      1
结果:

  id region1 region2 region3
1  1       0       1       1
2  2       0       1       0
3  3       1       0       0
这里有一种使用
(括号很重要)一行完成的“棘手”方法。假设您的
data.frame
命名为
df

(table(df) > 0)+0
#    region
# id  1 2 3
#   1 0 1 1
#   2 0 1 0
#   3 1 0 0

table(df)>0
为我们提供了
TRUE
FALSE
;添加
+0
会将
TRUE
FALSE
转换为数字。

我喜欢
重塑2
软件包,但有时事情看起来很慢。与您的代码相比,
(表(df)>0)+0
在我的系统上几乎快了24倍!指定
value.var
通常会使事情加快一点,但我想知道关于如何加快
dcast
是否还有其他技巧。我知道必须有一个
aggregate
解决方案,但我没有想到+1.@mrdwab别担心,我花了12个小时才点击它!
aggregate(model.matrix(~ region - 1, data=x), x["id"], max)
  id region1 region2 region3
1  1       0       1       1
2  2       0       1       0
3  3       1       0       0
(table(df) > 0)+0
#    region
# id  1 2 3
#   1 0 1 1
#   2 0 1 0
#   3 1 0 0