R语言 当标识符值之一为NA时,是否有办法透视数据?

ylamdve6  于 2023-06-19  发布在  其他
关注(0)|答案(2)|浏览(129)

我有一个例子数据

test <- data.frame(ID = c(rep(1, 3), rep(2,3), rep(3,3)), type = rep(c(3,3,NA),3), label = rep(c("test1", "test2", "test3"),3), value = rep(5:7,3))

我在type列中有X个值,我想透视labelvalue列中的值。我有type为NA的行,在这些情况下,我希望labelvalue中的相应值可以在type中有值的行中看到。当我使用tidyverse包中的pivot_wider函数时,我留下了type为NA,test3为NA的行:

test %>% pivot_wider(names_from = label, values_from = value)
# A tibble: 6 × 5
     ID  type test1 test2 test3
  <dbl> <dbl> <int> <int> <int>
1     1     3     5     6    NA
2     1    NA    NA    NA     7
3     2     3     5     6    NA
4     2    NA    NA    NA     7
5     3     3     5     6    NA
6     3    NA    NA    NA     7

为了解决这个问题,我研究了tidyverse complete函数,以获得typelabel的每个组合,但这会产生 every 组合,我只想对label == test 3这样做,因为这是NA type值所在的地方。

test %>% complete(label, value)
# A tibble: 15 × 4
   label value    ID  type
   <chr> <int> <dbl> <dbl>
 1 test1     5     1     3
 2 test1     5     2     3
 3 test1     5     3     3
 4 test1     6    NA    NA
 5 test1     7    NA    NA
 6 test2     5    NA    NA
 7 test2     6     1     3
 8 test2     6     2     3
 9 test2     6     3     3
10 test2     7    NA    NA
11 test3     5    NA    NA
12 test3     6    NA    NA
13 test3     7     1    NA
14 test3     7     2    NA
15 test3     7     3    NA

我不知道有没有更简单的方法?这就是我正在寻找的输出:

# A tibble: 3 × 5
     ID  type test1 test2 test3
  <dbl> <dbl> <int> <int> <int>
1     1     3     5     6     7
2     2     3     5     6     7
3     3     3     5     6     7

提前感谢!

cwtwac6a

cwtwac6a1#

这可能不适用于您的真实的数据,但它适用于您的示例。
我们要做的是透视范围,然后按ID分组,然后用组中的其他值填充NA值。这样就完成了组中的所有行,我们使用distinct来删除重复的行

test %>%
    pivot_wider(names_from = label, values_from = value) %>%
    group_by(ID) %>%
    fill(everything(), .direction='downup') %>%
    distinct()

     ID  type test1 test2 test3
  <dbl> <dbl> <int> <int> <int>
1     1     3     5     6     7
2     2     3     5     6     7
3     3     3     5     6     7

如果ID中的每一列都有多个值,则会遇到问题。例如,此数据在ID==3中具有多个test2值,并导致那里的行重复:

test2
# A tibble: 7 × 5
     ID  type test1 test2 test3
  <dbl> <dbl> <dbl> <dbl> <dbl>
1     1     3     5     6    NA
2     1    NA    NA    NA     7
3     2     3     5     6    NA
4     2    NA    NA    NA     7
5     3     3     5     6    NA
6     3    NA    NA    NA     7
7     3    NA    NA     3    NA

test2 %>%
    group_by(ID) %>%
    fill(everything(), .direction='downup') %>%
    distinct()

     ID  type test1 test2 test3
  <dbl> <dbl> <dbl> <dbl> <dbl>
1     1     3     5     6     7
2     2     3     5     6     7
3     3     3     5     6     7
4     3     3     5     3     7
hmtdttj4

hmtdttj42#

pivot_wider(fill(test, type),  id_cols = c(ID, type),names_from = label)

# A tibble: 3 × 5
     ID  type test1 test2 test3
  <dbl> <dbl> <int> <int> <int>
1     1     3     5     6     7
2     2     3     5     6     7
3     3     3     5     6     7

相关问题