我有許多變量,其中許多變量都有缺失值,包括第一次和最後一次觀察值。我想要一個新的數據集,它包含每個人的第一個和最後一個觀察值,忽略錯誤。在很多變量中存在NA的head()和tail()
在下面的代碼做的,但我希望1)有一些功能是類似於head()
,但無需拆卸NA
小號手動,2)的方式來寫一個函數dplyr
的summarize_each()
可以使用該數據集中的所有變量自動化(比id
等,當然)
set.seed(23331)
df <- data.frame(id=rep(c(1,2,3,4), each = 5),
a = c(NA, rnorm(4), rnorm(3), rep(NA, 2), rnorm(4), rep(NA, 5), rnorm(1)),
b = c(rep(NA, 2), rnorm(14), rep(NA, 3), rnorm(1)))
df %>% group_by(id) %>% summarise(a.head=head(a[!is.na(a)], n=1),
a.tail=tail(a[!is.na(a)], n=1),
b.head=head(b[!is.na(b)], n=1),
b.tail=tail(b[!is.na(b)], n=1)) %>%
gather("type", "value", -id) %>%
separate(type, into = c("variable", "time"), sep = "\\.") %>%
spread(variable, value)
我希望爲dplyr
解決方案,但會採取base
或data.table
解決方案,如果其中之一是去了解的最佳方式它。
所需的輸出:
來源:本地數據幀[8×4]
id time a b
(dbl) (chr) (dbl) (dbl)
1 1 head -0.5877282 0.4975612
2 1 tail -0.7904277 -0.3860010
3 2 head 0.5872134 -0.3923887
4 2 tail -0.3222003 0.3114662
5 3 head -0.2553290 0.7521095
6 3 tail 0.3095699 -0.9113326
7 4 head -0.3809334 1.4752274
8 4 tail -0.3809334 3.2767918
可以減少幾個步驟'DF%>%GROUP_BY(ID)%>%summarise_each(玩意兒(頭=頭([ (。)],n = 1),Tail = tail(。[!is.na(。)],n = 1)))%>%gather(Var,Val,-id)%>%單獨的(Var,c('Variable','time'))%>%spread(Variable,Val)' – akrun
(1)'na.omit(x)'比'x [!is.na x)]的'; (2)爲了進一步提高可讀性,爲什麼不寫輔助函數(例如'hn1 < - function(x)head(na.omit(x),1)')? –