我有一个例子数据
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个值,我想透视label
和value
列中的值。我有type
为NA的行,在这些情况下,我希望label
和value
中的相应值可以在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
函数,以获得type
和label
的每个组合,但这会产生 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
提前感谢!
2条答案
按热度按时间cwtwac6a1#
这可能不适用于您的真实的数据,但它适用于您的示例。
我们要做的是透视范围,然后按ID分组,然后用组中的其他值填充NA值。这样就完成了组中的所有行,我们使用distinct来删除重复的行
如果ID中的每一列都有多个值,则会遇到问题。例如,此数据在
ID==3
中具有多个test2
值,并导致那里的行重复:hmtdttj42#