ayk*_*ayk 6 r spread dplyr tidyr
如何更改以下表格:
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
Run Code Online (Sandbox Code Playgroud)
改成:
Type Name Yes No DK NA
TypeA Apple 5 10 8 20
TypeA Orange 6 11 8 23
Run Code Online (Sandbox Code Playgroud)
我使用以下代码来获取第一个表.
df_1 <-
df %>%
group_by(Type, Name, Answer) %>%
tally()
Run Code Online (Sandbox Code Playgroud)
然后我尝试使用spread命令到达第二个表,但是我收到以下错误消息:
"错误:所有列都必须命名为"
df_2 <- spread(df_1, Answer)
Run Code Online (Sandbox Code Playgroud)
继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
Run Code Online (Sandbox Code Playgroud)
这给出了一个看起来像这样的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
Run Code Online (Sandbox Code Playgroud)
然后,当我们尝试整理它时,我们收到一条错误消息:
df_1 %>% spread(key=Answer, value=n)
Error: All columns must be named
Run Code Online (Sandbox Code Playgroud)
但是,如果我们删除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
Run Code Online (Sandbox Code Playgroud)
但是,删除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
Run Code Online (Sandbox Code Playgroud)
我认为只需要tidyr从df_1到df_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)
Run Code Online (Sandbox Code Playgroud)
输出:
Type Name DK No Yes NA
1 TypeA Apple 8 10 5 20
2 TypeA Orange 8 11 6 23
Run Code Online (Sandbox Code Playgroud)