首页 > 解决方案 > 按行提取非缺失元素并堆叠它们

问题描述

我有一个这样的数据框

df <- data.frame(id = 1:4,
  V1 = c("A", NA, "C", NA),
  V2 = c(NA, NA, NA, "E"),
  V3 = c(NA, "B", NA, "F"),
  V4 = c(NA, NA, "D", NA), stringsAsFactors = F)

#   id   V1   V2   V3   V4
# 1  1    A <NA> <NA> <NA>
# 2  2 <NA> <NA>    B <NA>
# 3  3    C <NA> <NA>    D
# 4  4 <NA>    E    F <NA>

如何按行提取非缺失元素并将它们堆叠成一列?我的预期输出是:

#   id value
# 1  1     A
# 2  2     B
# 3  3     C
# 4  3     D
# 5  4     E
# 6  4     F

标签: rtidyverse

解决方案


尝试pivot_longer()unite() + separate_rows()

library(tidyr)
library(dplyr)

# Method 1
df %>%
  pivot_longer(-id, values_drop_na = T) %>%
  select(-name)

# Method 2
df %>%
  unite(value, -id, na.rm = T) %>%
  separate_rows(value)

# # A tibble: 6 x 2
#      id value
#   <int> <chr>
# 1     1 A    
# 2     2 B    
# 3     3 C    
# 4     3 D    
# 5     4 E    
# 6     4 F  

推荐阅读