我有一个数据集,我希望每个项目缩减为一行,但截至目前,它已经填充了很多NA,因此关于该项目的每一行都有一条信息。它的样本如下:
<script src="https://maps.googleapis.com/maps/api/js"></script>
<div id="map_canvas"></div>
我怎样才能得到这个,以便每个ID只有一行包含所有信息?
答案 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)