11

我正在尝试转换以下格式:

mydata <- data.frame(movie = c("Titanic", "Departed"), 
                     actor1 = c("Leo", "Jack"), 
                     actor2 = c("Kate", "Leo"))

     movie actor1 actor2
1  Titanic    Leo   Kate
2 Departed   Jack    Leo

二进制响应变量:

     movie Leo Kate Jack
1  Titanic   1    1    0
2 Departed   1    0    1

我尝试了 将行数据转换为二进制列中描述的解决方案, 但我可以让它适用于两个变量,而不是三个。

如果有一种干净的方法可以做到这一点,我将不胜感激。

4

5 回答 5

15

多少香料太多了?这是一个解决方案tidyr

library(dplyr)
library(tidyr)

mydata %>%
  gather(actor,name,starts_with("actor")) %>%
  mutate(present = 1) %>%
  select(-actor) %>%
  spread(name,present,fill = 0)

       movie Jack Kate Leo
 1 Departed    1    0   1
 2  Titanic    0    1   1
于 2014-06-23T19:52:52.023 回答
7

重塑你的一种方法data.frame是使用reshape2包,使用meltand dcast。例如:

library(reshape2)
long.mydata <- melt(mydata, id.vars = "movie")
wide.mydata <- dcast(long.mydata, movie ~ value, function(x) 1, fill = 0)

注意fun.aggregate和中的fill参数dcast,它们控制铸造后填充内部的内容。

于 2013-08-27T23:01:21.737 回答
4

因为他们说多样性是生活的调味品,所以这里有一种在基础 R 中使用的方法table

table(cbind(mydata[1], 
            actor = unlist(mydata[-1], use.names=FALSE)))
#           actor
# movie      Jack Leo Kate
#   Departed    1   1    0
#   Titanic     0   1    1

上面的输出是一个matrixtable。要获得data.frame,请使用as.data.frame.matrix

as.data.frame.matrix(table(
  cbind(mydata[1], actor = unlist(mydata[-1], use.names=FALSE))))
#          Jack Leo Kate
# Departed    1   1    0
# Titanic     0   1    1
于 2013-09-03T04:18:30.273 回答
1

-packagereshape2也有recast-function。

编码:

library(reshape2)
recast(mydata, id.var = 'movie', movie ~ value, fun.aggregate = length)

结果:

     movie Jack Kate Leo
1 Departed    1    0   1
2  Titanic    0    1   1
于 2017-11-26T09:01:34.733 回答
1

一个基于更新tidyr的选项是转换为长形,用于complete填充缺少的电影和演员组合,然后将逻辑is.na测试转换为数值。然后重塑回宽。

library(tidyr)

mydata %>%
  pivot_longer(starts_with("actor"), names_to = "acted") %>%
  complete(movie, value) %>%
  dplyr::mutate(acted = as.numeric(!is.na(acted))) %>%
  pivot_wider(names_from = value, values_from = acted)
#> # A tibble: 2 x 4
#>   movie     Jack   Leo  Kate
#>   <fct>    <dbl> <dbl> <dbl>
#> 1 Departed     1     1     0
#> 2 Titanic      0     1     1
于 2019-11-09T19:52:43.093 回答