如何在tidyr中正确使用传播功能

时间:2016-01-08 19:47:47

标签: r dplyr tidyr spread

如何更改以下表格:

Type    Name    Answer     n
TypeA   Apple   Yes        5
TypeA   Apple   No        10
TypeA   Apple   DK         8
TypeA   Apple   NA        20
TypeA   Orange  Yes        6
TypeA   Orange  No        11
TypeA   Orange  DK         8
TypeA   Orange  NA        23

更改为:

Type    Name    Yes   No   DK   NA  
TypeA   Apple   5     10   8    20
TypeA   Orange  6     11   8    23

我使用以下代码来获取第一个表格。

df_1 <- 
  df %>% 
  group_by(Type, Name, Answer) %>% 
  tally()  

然后我尝试使用spread命令进入第二个表,但是我收到以下错误消息:

  

“错误:所有列都必须命名为”

df_2 <- spread(df_1, Answer)

2 个答案:

答案 0 :(得分:6)

根据ayk的评论,我提供了一个例子。在我看来,当你有一个data_frame,其中一个因子或字符类的列具有NA值时,如果没有删除它们或重新分类数据,就无法传播。这特定于data_frame(请注意名称中带有下划线的dplyr类),因为当我在data.frame中有NA值时,这适用于我的示例。例如,上面示例的略微修改版本:

这是数据框

library(dplyr)
library(tidyr)
df_1 <- data_frame(Type = c("TypeA", "TypeA", "TypeB", "TypeB"),
                   Answer = c("Yes", "No", NA, "No"),
                   n = 1:4)
df_1

这给出了一个看起来像这样的数据框

Source: local data frame [4 x 3]

   Type Answer     n
  (chr)  (chr) (int)
1 TypeA    Yes     1
2 TypeA     No     2
3 TypeB     NA     3
4 TypeB     No     4

然后,当我们尝试整理它时,我们会收到一条错误消息:

df_1 %>% spread(key=Answer, value=n)
Error: All columns must be named

但是,如果我们删除了NA,那么它就会起作用&#39;:

df_1 %>%
    filter(!is.na(Answer)) %>%
    spread(key=Answer, value=n)
Source: local data frame [2 x 3]

   Type    No   Yes
  (chr) (int) (int)
1 TypeA     2     1
2 TypeB     4    NA

但是,删除NA可能无法获得所需的结果:即您可能希望将这些包含在整理的表中。您可以直接修改数据以将NA更改为更具描述性的值。或者,您可以将数据更改为data.frame,然后传播就可以了:

as.data.frame(df_1) %>% spread(key=Answer, value=n)
   Type No Yes NA
1 TypeA  2   1 NA
2 TypeB  4  NA  3

答案 1 :(得分:3)

我认为从df_1df_2只需要tidyr

library(magrittr)
df_1 <- read.csv(text="Type,Name,Answer,n\nTypeA,Apple,Yes,5\nTypeA,Apple,No,10\nTypeA,Apple,DK,8\nTypeA,Apple,NA,20\nTypeA,Orange,Yes,6\nTypeA,Orange,No,11\nTypeA,Orange,DK,8\nTypeA,Orange,NA,23", stringsAsFactors=F)

df_2 <- df_1 %>% 
  tidyr::spread(key=Answer, value=n)

输出:

   Type   Name DK No Yes NA
1 TypeA  Apple  8 10   5 20
2 TypeA Orange  8 11   6 23