Извлечь не пропущенные элементы по строкам и сложить их - PullRequest
2 голосов
/ 02 марта 2020

У меня есть такой фрейм данных

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

Ответы [ 5 ]

3 голосов
/ 02 марта 2020

Попробуйте 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  
1 голос
/ 02 марта 2020

Как насчет объединения complete.cases с библиотекой изменения формы?

library(reshape2)

df.temp <- melt(df, id.vars = "id")
df.temp[complete.cases(df.temp),-2]    

приводит к

   id value
1   1     A
3   3     C
8   4     E
10  2     B
12  4     F
15  3     D
1 голос
/ 02 марта 2020

Одно base R решение может быть:

na.omit(data.frame(df[1], stack(df[-1])[1]))

   id values
1   1      A
3   3      C
8   4      E
10  2      B
12  4      F
15  3      D
1 голос
/ 02 марта 2020

Вы можете использовать dplyr и tidyr:

df %>% 
   tidyr::gather(-id, key = "key", value = "value") %>% 
   dplyr::filter(!is.na(value))

  id key value
1  1  V1     A
2  3  V1     C
3  4  V2     E
4  2  V3     B
5  4  V3     F
6  3  V4     D
0 голосов
/ 02 марта 2020

pivot_longer затем filter

library(tidyverse)

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 = FALSE)

df %>% pivot_longer(-id, names_to = "name", values_to = "value") %>% 
  filter(!is.na(value)) %>% 
  select(-name)
#> # 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

Создано в 2020-03-02 пакетом Представить (v0.3.0)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...