提前感谢您的帮助。
在使用spread
的{{1}}重复行上使用unite
(从长到宽)有几个问题,例如this。
我认为让我的问题与众不同的是需要输出虚拟变量。
我期待这样的输入:
df <- data.frame(id = c(1,1,2,3,4), fruit = c("apple","pear","apple","orange","apple"))
这样的输出:
output <- data.frame(id=c(1,2,3,4), apple = c(1,1,0,1), pear = c(1,0,0,0), orange = c(0,0,1,0))
非常感谢任何帮助。感谢。
答案 0 :(得分:4)
使用tidyverse
您可以添加新列,而不是使用spread
。
library(tidyverse)
df %>% mutate(i = 1) %>% spread(fruit, i, fill = 0)
# result
id apple orange pear
1 1 1 0 1
2 2 1 0 0
3 3 0 1 0
4 4 1 0 0
答案 1 :(得分:2)
您可以使用dcast()
包中的data.table
。
data.table::dcast(df,
id ~ fruit,
fun.aggregate = function(x) 1L,
fill = 0L)
将返回
id apple orange pear
1 1 1 0 1
2 2 1 0 0
3 3 0 1 0
4 4 1 0 0