R:根据数据框中所有变量的唯一 ID 替换一行中的缺失值
R: Replace missing values in one row based on unique ID for all variables in dataframe
我正在处理一个“长”数据框,其中独特的参与者随着时间的推移有多个观察结果。一些行在多个列中缺少数据,那些缺少的记录需要为每个参与者填充相同的数据。
我的数据集如下所示:
list(
ID = c("A23", "A23", "A24", "A24", "A24", "A50", "A50", "A60", "A60"),
A = c("Y", "Y", "N", "N", NA, "Y", NA, "N", "N"),
B = c(2.4, 2.4, 2.6, 2.6, NA, 2.2, NA, 3.3, 3.3),
C = c("M", "M", "F", "F", NA, "F", NA, "M", "M"),
D = c(1, 1, 0, 0, NA, 1, NA, 1, 1),
E = c("2015-02-16", "2017-10-05", "2014-03-26", "2016-09-07", "2018-10-08", "2015-02-17", "2017-10-06", "2014-03-27", "2016-09-08"))
我希望能够简单地从 complete/non-missing 行复制数据并将其粘贴到基于 ID
变量的缺失记录中,跨越整个数据框。
我试过以下方法都没有用(没有替换缺失值):
library(tidyverse)
library(zoo)
library(plyr)
# Attempt 1:
data %>%
group_by(ID) %>%
mutate_all(~replace(., is.na(.), .[!is.na(.)][1]))
# Attempt 2:
plyr::ddply(data, ~ID, na.locf)
我找到了需要替换单个列的缺失值的解决方案,但我还没有找到替换整个数据帧中缺失值的解决方案。
提前致谢。
您可以使用 dplyr 中的 group_by/mutate 方法解决此问题:
library(dplyr)
df <- tibble(
ID = c("A23", "A23", "A24", "A24", "A24", "A50", "A50", "A60", "A60"),
A = c("Y", "Y", "N", "N", NA, "Y", NA, "N", "N"),
B = c(2.4, 2.4, 2.6, 2.6, NA, 2.2, NA, 3.3, 3.3),
C = c("M", "M", "F", "F", NA, "F", NA, "M", "M"),
D = c(1, 1, 0, 0, NA, 1, NA, 1, 1),
E = c("2015-02-16", "2017-10-05", "2014-03-26", "2016-09-07", "2018-10-08",
"2015-02-17", "2017-10-06", "2014-03-27", "2016-09-08"))
fix_nas <- function(x){
x[complete.cases(x)][1]
}
df %>%
group_by(ID) %>%
mutate_at(2:5, fix_nas)
来自 tidyr
的 fill()
应该有效:
df %>%
group_by(ID) %>%
fill(names(df))
# A tibble: 9 x 6
# Groups: ID [4]
ID A B C D E
<chr> <chr> <dbl> <chr> <dbl> <chr>
1 A23 Y 2.4 M 1 2015-02-16
2 A23 Y 2.4 M 1 2017-10-05
3 A24 N 2.6 F 0 2014-03-26
4 A24 N 2.6 F 0 2016-09-07
5 A24 N 2.6 F 0 2018-10-08
6 A50 Y 2.2 F 1 2015-02-17
7 A50 Y 2.2 F 1 2017-10-06
8 A60 N 3.3 M 1 2014-03-27
9 A60 N 3.3 M 1 2016-09-08
我正在处理一个“长”数据框,其中独特的参与者随着时间的推移有多个观察结果。一些行在多个列中缺少数据,那些缺少的记录需要为每个参与者填充相同的数据。
我的数据集如下所示:
list(
ID = c("A23", "A23", "A24", "A24", "A24", "A50", "A50", "A60", "A60"),
A = c("Y", "Y", "N", "N", NA, "Y", NA, "N", "N"),
B = c(2.4, 2.4, 2.6, 2.6, NA, 2.2, NA, 3.3, 3.3),
C = c("M", "M", "F", "F", NA, "F", NA, "M", "M"),
D = c(1, 1, 0, 0, NA, 1, NA, 1, 1),
E = c("2015-02-16", "2017-10-05", "2014-03-26", "2016-09-07", "2018-10-08", "2015-02-17", "2017-10-06", "2014-03-27", "2016-09-08"))
我希望能够简单地从 complete/non-missing 行复制数据并将其粘贴到基于 ID
变量的缺失记录中,跨越整个数据框。
我试过以下方法都没有用(没有替换缺失值):
library(tidyverse)
library(zoo)
library(plyr)
# Attempt 1:
data %>%
group_by(ID) %>%
mutate_all(~replace(., is.na(.), .[!is.na(.)][1]))
# Attempt 2:
plyr::ddply(data, ~ID, na.locf)
我找到了需要替换单个列的缺失值的解决方案,但我还没有找到替换整个数据帧中缺失值的解决方案。
提前致谢。
您可以使用 dplyr 中的 group_by/mutate 方法解决此问题:
library(dplyr)
df <- tibble(
ID = c("A23", "A23", "A24", "A24", "A24", "A50", "A50", "A60", "A60"),
A = c("Y", "Y", "N", "N", NA, "Y", NA, "N", "N"),
B = c(2.4, 2.4, 2.6, 2.6, NA, 2.2, NA, 3.3, 3.3),
C = c("M", "M", "F", "F", NA, "F", NA, "M", "M"),
D = c(1, 1, 0, 0, NA, 1, NA, 1, 1),
E = c("2015-02-16", "2017-10-05", "2014-03-26", "2016-09-07", "2018-10-08",
"2015-02-17", "2017-10-06", "2014-03-27", "2016-09-08"))
fix_nas <- function(x){
x[complete.cases(x)][1]
}
df %>%
group_by(ID) %>%
mutate_at(2:5, fix_nas)
tidyr
的 fill()
应该有效:
df %>%
group_by(ID) %>%
fill(names(df))
# A tibble: 9 x 6
# Groups: ID [4]
ID A B C D E
<chr> <chr> <dbl> <chr> <dbl> <chr>
1 A23 Y 2.4 M 1 2015-02-16
2 A23 Y 2.4 M 1 2017-10-05
3 A24 N 2.6 F 0 2014-03-26
4 A24 N 2.6 F 0 2016-09-07
5 A24 N 2.6 F 0 2018-10-08
6 A50 Y 2.2 F 1 2015-02-17
7 A50 Y 2.2 F 1 2017-10-06
8 A60 N 3.3 M 1 2014-03-27
9 A60 N 3.3 M 1 2016-09-08