首页 > 解决方案 > 使用 tidyr,当传播值得到 NA

问题描述

我有一个问题,我使用 tidyr 尝试转换数据,从长到宽和从宽到长。所有功能作为收集,联合工作正常,但是当我应用传播时,我得到了正确的格式,但很大比例的值变成了 NA。我无法上传这些数据。你对为什么会变成这样以及我能做些什么有想法吗?

标签: rtidyverse

解决方案


一个常见的错误(我也犯过)是,在应用该函数时spread,数据中仍有一列与每个预期的行不同。

一个例子:

数据

df <- data.frame(id = rep(1:5,2),
                 g = rep(1:2,5),
                 gname = rep(letters[1:2],5),
                 x1 = letters[1:10],
                 x2 = letters[11:20])

代码

df %>%
  gather(key,value,-id,-g,-gname) %>%
  unite(dummy,key,g) %>%
  spread(dummy,value)

结果

# A tibble: 10 x 6
      id gname x1_1  x1_2  x2_1  x2_2 
   <int> <fct> <chr> <chr> <chr> <chr>
 1     1 a     a     NA    k     NA   
 2     1 b     NA    f     NA    p    
 3     2 a     g     NA    q     NA   
 4     2 b     NA    b     NA    l    
 5     3 a     c     NA    m     NA   
 6     3 b     NA    h     NA    r    
 7     4 a     i     NA    s     NA   
 8     4 b     NA    d     NA    n    
 9     5 a     e     NA    o     NA   
10     5 b     NA    j     NA    t    

因为gname是在使用传播之前留下的数据,所以出问题了。

所以以下:

df %>%
  gather(key,value,-id,-g,-gname) %>%
  unite(dummy,key,g) %>%
  select(-gname) %>%
  spread(dummy,value)

给出正确的结果:

  id x1_1 x1_2 x2_1 x2_2
1  1    a    f    k    p
2  2    g    b    q    l
3  3    c    h    m    r
4  4    i    d    s    n
5  5    e    j    o    t

推荐阅读