ivot_wider似乎不适用于缺少值。缺少值时如何将spread()转换为pivot_wider()

时间:2019-12-13 17:14:02

标签: r tidyr

由于spread()函数已被新的pivot_wider()函数代替,我从现在开始尝试使用pivot_wider(),但由于缺少值,它似乎无法正常工作。任何帮助都非常感激

# This is an example I saw on the web

surveys <- read.csv("http://kbroman.org/datacarp/portal_data_joined.csv",
                    stringsAsFactors = FALSE)
library(dplyr)

surveys %>%
  filter(taxa == "Rodent",
         !is.na(weight)) %>%
  group_by(sex,genus) %>%
  summarize(mean_weight = mean(weight)) %>% 
  spread(sex, mean_weight)```

#It gives me the following output. This is what I would like to get
# A tibble: 10 x 4
   genus              V1      F      M
   <chr>           <dbl>  <dbl>  <dbl>
 1 Baiomys          NA     9.16   7.36
 2 Chaetodipus      19.8  23.8   24.7 
 3 Dipodomys        81.4  55.2   56.2 
 4 Neotoma         168.  154.   166.  
 5 Onychomys        23.4  26.8   26.2 
 6 Perognathus       6     8.57   8.20
 7 Peromyscus       19.9  22.5   20.6 
 8 Reithrodontomys  11.1  11.2   10.2 
 9 Sigmodon         70.3  71.7   61.3 
10 Spermophilus     NA    57    130  
surveys %>%
  filter(taxa == "Rodent",
         !is.na(weight)) %>%
  group_by(sex,genus) %>%
  summarize(mean_weight = mean(weight)) %>%
  pivot_wider(
    names_from = sex,
    values_from = mean_weight,
    names_repair = "minimal"
    )

It says the following
Error: Column 1 must be named.
Use .name_repair to specify repair.
Run `rlang::last_error()` to see where the error occurred.

1 个答案:

答案 0 :(得分:1)

在透视之前替换掉性别中缺失的值:

surveys %>%
  filter(taxa == "Rodent",
         !is.na(weight)) %>%
  group_by(sex,genus) %>%
  summarize(mean_weight = mean(weight)) %>%
  ungroup() %>% 
  mutate(sex = if_else(sex == "", "unknown", sex)) %>% 
  pivot_wider(
    names_from = sex,
    values_from = mean_weight,
    names_repair = "minimal"
  )