如何更改以下表格:
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)
答案 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_1
到df_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