6

如何更改下表:

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)
4

2 回答 2

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

这给出了一个看起来像这样的 data_frame

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,那么它“有效”:

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
于 2016-01-14T23:12:45.470 回答
5

我认为从to只需要tidyrdf_1df_2

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
于 2016-01-09T19:32:57.073 回答