了解tidyr :: gather键/值参数

时间:2018-02-09 01:46:26

标签: r tidyr

简单的问题,

我在下面用代码/输出提供了两个不同的数据框,为什么一个工作而另一个不工作?无法理解键/值输入(当需要明确定义时/以及将它们作为输入中的字符串意味着什么)。

library(tidyverse)
dat <- data.frame(one = c("x", "x", "x"), two = c("x", "", "x"), 
                   three = c("", "", ""), type = c("chocolate", "vanilla", "strawberry")) 

dat %>%
  na_if("") %>%
  gather("Key", "Val", -type,na.rm=TRUE) %>%
  rowid_to_column  %>%
  spread(Key, Val,fill = "") %>%
  select(-1) # works well 

dat %>%
  na_if("") %>%
  gather("Key", "Val", -type,na.rm=TRUE) 
Error: Strings must match column names. Unknown columns: Val

额外信用:如果有人能解释rowit_to_column&amp; spread(),这会有所帮助。

1 个答案:

答案 0 :(得分:1)

也许我错过了什么,但我无法重现你的错误。

dat %>%
  na_if("") %>%                                  # Replace "" with NA
  gather("Key", "Val", -type, na.rm = TRUE) %>%  # wide -> long
  rowid_to_column()  %>%                         # Sequentially number rows
  spread(Key, Val, fill = "") %>%                # long -> wide
  select(-1) # works well                        # remove row number
  #        type one two
  #1  chocolate   x
  #2    vanilla   x
  #3 strawberry   x
  #4  chocolate       x
  #5 strawberry       x



dat %>%                                          
  na_if("") %>%                                  # Replace "" with NA
  gather("Key", "Val", -type, na.rm = TRUE)      # wide -> long
#        type Key Val
#1  chocolate one   x
#2    vanilla one   x
#3 strawberry one   x
#4  chocolate two   x
#6 strawberry two   x

说明:

  1. na_if("")""条目替换为NA
  2. gather("Key", "Val", -type, na.rm = TRUE)将广泛的表格转换为一个长的“键值”表,方法是将条目存储在 type的所有列<{1>}中的两列Key中即列名称)和Val(即条目)。 na.rm = TRUE会删除NA个值的行。
  3. rowid_to_column按顺序对行进行编号。
  4. spread(Key, Val, fill = "")将一个长的“键值”表格变成一个宽表格,列数与Key中的唯一键一样多。条目来自Val列,如果缺少某个条目,则会填充""
  5. select(-1)删除第一列。