R:使用 tidyr 清理具有结构缺失和冗余数据的数据 table
R: use tidyr to clean-up data table with structural missing and redundant data
仍在努力获取 tidyr
软件包。如果一个数据集包含这样的冗余行:
require(dplyr)
require(tidyr)
data <-
data.frame(
v1 = c("ID1", NA, "ID2", NA),
v2 = c("x", NA, "xx", NA),
v3 = c(NA, "z", NA, "zz"),
v4 = c(22, 22, 6, 6),
v5 = c(5, 5, 9, 9)) %>%
tbl_df()
> data
Source: local data frame [4 x 5]
v1 v2 v3 v4 v5
1 ID1 x NA 22 5
2 NA NA z 22 5
3 ID2 xx NA 6 9
4 NA NA zz 6 9
由于 id 变量 v1
- v3
被分成具有许多 NA 的冗余行(因此这两个测量值也重复),人们希望得到如下所示的内容:
v1 v2 v3 v4 v5
1 ID1 x z 22 5
2 ID2 xx zz 6 9
使用 tidyr
获取此信息的一般方法是什么?我觉得可以使用 gather()
来完成,但是怎么做呢?
一种方法是这样的。使用 zoo
包中的 na.locf()
,我替换了 v1
中的 NA。然后,我使用变量对数据进行分组。我又雇佣了 na.locf()
一次来照顾 v3
。最后,我删除了 v2
.
中带有 NA 的行
library(zoo)
library(dplyr)
mutate(data, v1 = na.locf(v1)) %>%
group_by(v1) %>%
mutate(v3 = na.locf(v3, fromLast = TRUE)) %>%
filter(complete.cases(v2)) %>%
ungroup
# v1 v2 v3 v4 v5
#1 ID1 x z 22 5
#2 ID2 xx zz 6 9
你也可以
library(dplyr)
data %>%
mutate(v3=v3[!is.na(v3)][cumsum(is.na(v3))]) %>%
na.omit()
# v1 v2 v3 v4 v5
#1 ID1 x z 22 5
#2 ID2 xx zz 6 9
或根据显示的数据
data %>%
mutate(v3=lead(as.character(v3))) %>%
na.omit()
仍在努力获取 tidyr
软件包。如果一个数据集包含这样的冗余行:
require(dplyr)
require(tidyr)
data <-
data.frame(
v1 = c("ID1", NA, "ID2", NA),
v2 = c("x", NA, "xx", NA),
v3 = c(NA, "z", NA, "zz"),
v4 = c(22, 22, 6, 6),
v5 = c(5, 5, 9, 9)) %>%
tbl_df()
> data
Source: local data frame [4 x 5]
v1 v2 v3 v4 v5
1 ID1 x NA 22 5
2 NA NA z 22 5
3 ID2 xx NA 6 9
4 NA NA zz 6 9
由于 id 变量 v1
- v3
被分成具有许多 NA 的冗余行(因此这两个测量值也重复),人们希望得到如下所示的内容:
v1 v2 v3 v4 v5
1 ID1 x z 22 5
2 ID2 xx zz 6 9
使用 tidyr
获取此信息的一般方法是什么?我觉得可以使用 gather()
来完成,但是怎么做呢?
一种方法是这样的。使用 zoo
包中的 na.locf()
,我替换了 v1
中的 NA。然后,我使用变量对数据进行分组。我又雇佣了 na.locf()
一次来照顾 v3
。最后,我删除了 v2
.
library(zoo)
library(dplyr)
mutate(data, v1 = na.locf(v1)) %>%
group_by(v1) %>%
mutate(v3 = na.locf(v3, fromLast = TRUE)) %>%
filter(complete.cases(v2)) %>%
ungroup
# v1 v2 v3 v4 v5
#1 ID1 x z 22 5
#2 ID2 xx zz 6 9
你也可以
library(dplyr)
data %>%
mutate(v3=v3[!is.na(v3)][cumsum(is.na(v3))]) %>%
na.omit()
# v1 v2 v3 v4 v5
#1 ID1 x z 22 5
#2 ID2 xx zz 6 9
或根据显示的数据
data %>%
mutate(v3=lead(as.character(v3))) %>%
na.omit()