如何在R中用太多的NA压缩数据集?

时间:2018-04-14 20:56:08

标签: r na

我有一个数据集,我希望每个项目缩减为一行,但截至目前,它已经填充了很多NA,因此关于该项目的每一行都有一条信息。它的样本如下:

<script src="https://maps.googleapis.com/maps/api/js"></script>
<div id="map_canvas"></div>

我怎样才能得到这个,以便每个ID只有一行包含所有信息?

3 个答案:

答案 0 :(得分:1)

使用dplyr::summarise_at的解决方案可以实现为:

library(dplyr)
df %>% group_by(ID) %>%
  summarise_at(vars(Title:Illustrator), funs(.[!is.na(.)])) %>%
  data.frame()

#      ID           Title          Composer          Lyricist   Illustrator
# 1 a0018 My Western Rose Lincoln, Harry J. Vandersloot, F.W. Dittmar, W.J
# 

数据

df <- read.table(text =
"ID     Title             Composer           Lyricist          Illustrator
a0018  'My Western Rose'   NA                 NA                NA
a0018  NA                'Lincoln, Harry J.'  NA                NA
a0018  NA                NA                 'Vandersloot, F.W.' NA
a0018  NA                NA                 NA                'Dittmar, W.J.'",
header = TRUE, stringsAsFactors = FALSE)

答案 1 :(得分:0)

使用tidyverse套件包,尝试

clean_df <- df %>%
   gather(key, value) %>%
   drop_na(value) %>%
   gather(key, value)

如果您不熟悉管道运算符(%>%),它将获取前一个函数的结果并将其作为下一个函数中的第一个参数插入。首先,它只是使代码更容易阅读。

答案 2 :(得分:0)

我认为这可以满足您的需求。 tribble系列只是为了将数据转换为可重现的data.frame,因此您只需使用data.frame名称而不是&#39; dat&#39;。

dat <- tribble(
~ID,     ~Title,             ~Composer,           ~Lyricist,          ~Illustrator,
"a0018",  "My Western Rose",   NA,                 NA,                NA,
"a0018",  NA,                "Lincoln, Harry J.",  NA,                NA,
"a0018",  NA,                NA,                 "Vandersloot, F.W.", NA,
"a0018" , NA,                NA,                 NA,                "Dittmar, W.J."
)
clean_df <- dat %>%
gather(key, value, na.rm=T) %>%
unique() %>% 
spread(key, value) %>% 
select(ID, Title, Composer, Lyricist, Illustrator)