我正在处理一些调查答复,并且返回的数据格式很笨拙。这是数据的示例:
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完成此操作,但到目前为止我还没有任何运气。
答案 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