使用R结合基于公共变量的数据帧中的行

时间:2019-05-22 17:25:06

标签: r dplyr

我正在处理一些调查答复,并且返回的数据格式很笨拙。这是数据的示例:

df <- data_frame(Person = c("Person1", "Person1","Person2", "Person2","Person3", "Person3"), Q1 = c(NA, 1, NA, 2, NA, 1), Q2 = c(NA, 3, NA, 2, NA, 4),
             Q3 = c(2, NA, 4, NA, 1, NA), Q4 = c(5, NA, 5, NA, 5, NA))

这就是我的开始:

Person     Q1    Q2    Q3    Q4
  <chr>   <dbl> <dbl> <dbl> <dbl>
1 Person1    NA    NA     2     5
2 Person1     1     3    NA    NA
3 Person2    NA    NA     4     5
4 Person2     2     2    NA    NA
5 Person3    NA    NA     1     5
6 Person3     1     4    NA    NA

这就是我想要的:

Person     Q1    Q2    Q3    Q4
  <chr>   <dbl> <dbl> <dbl> <dbl>
1 Person1     1     3     2     5
2 Person2     2     2     4     5
3 Person3     1     4     1     5

我希望能够使用dplyr完成此操作,但到目前为止我还没有任何运气。

2 个答案:

答案 0 :(得分:1)

如果每个组的每一列中只有一个非NA元素

library(dplyr)
df %>% 
   group_by(Person) %>%
   summarise_all(na.omit)
# A tibble: 3 x 5
#  Person     Q1    Q2    Q3    Q4
#  <chr>   <dbl> <dbl> <dbl> <dbl>
#1 Person1     1     3     2     5
#2 Person2     2     2     4     5
#3 Person3     1     4     1     5

我们还可以使用min/max/sum/median/

df  %>%
     group_by(Person) %>%
      summarise_all(mean, na.rm = TRUE)

df %>%
   group_by(Person) %>%
   summarise_all(min, na.rm = TRUE)

df %>%
   group_by(Person) %>%
   summarise_all(median, na.rm = TRUE)

此外,任何删除NA并获得first非NA元素的函数

df %>%
    group_by(Person) %>%
    summarise_all(list(~.[!is.na(.)]))

如果非NA元素大于1,则字符串中的paste或具有list

df %>% 
    group_by(Person) %>%
    summarise_all(list(~ toString(.[!is.na(.)])))

答案 1 :(得分:1)

您可以使用coalesce获取每个组中每个列的第一个非NA。除非您的非NA值大于1,否则没有任何理由比na.omit更喜欢。

library(tidyverse)

df %>% 
  group_by(Person) %>% 
  summarise_all(reduce, coalesce)

# # A tibble: 3 x 5
#   Person     Q1    Q2    Q3    Q4
#   <chr>   <dbl> <dbl> <dbl> <dbl>
# 1 Person1     1     3     2     5
# 2 Person2     2     2     4     5
# 3 Person3     1     4     1     5