用相邻行 R 中的重复项替换 NA
Replacing NA with duplicates from adjacent row R
我有一个包含特征 Date
、Age
和 Customer_ID
的数据集。 Age
中的某些行中有缺失值 (NA),我想估算它们。
这是一些示例数据:
Date <- c("201101", "201102", "201101", "201102", "201103")
Age <- c("12-17", "12-17", "30-35", NA, NA)
Customer_ID <- c("1234", "1234", "5678", "5678", "5678")
df <- data.frame(Date, Age, Customer_ID)
Date Age Customer_ID
201101 12-17 1234
201102 12-17 1234
201101 30-35 5678
201102 NA 5678
201103 NA 5678
我想用 30-35 替换 Age
中的 NA。
因此对于所有的 NA,它必须检查是否有另一行具有相同的 Customer_ID
并将 NA 替换为另一行中所述的 Age
的值。
关于如何做到这一点有什么想法吗?谢谢。
您可以使用 tidyr
中的 fill
函数。它是一个 tidyr
函数,用于 上次观察结转 ,即用先前的非 NA 值填充 NA 值。为了使其工作,您可以使用 arrange
对 column2 进行排序,该列将 NA
值排序在非 NA 后面,然后您可以按客户 ID 分组并填充 Age
列:
library(dplyr)
library(tidyr)
df %>% arrange(Age) %>% group_by(Customer_ID) %>% fill(Age)
# Source: local data frame [5 x 3]
# Groups: Customer_ID [2]
# Date Age Customer_ID
# <fctr> <fctr> <fctr>
# 1 201101 12-17 1234
# 2 201102 12-17 1234
# 3 201101 30-35 5678
# 4 201102 30-35 5678
# 5 201103 30-35 5678
基数 R:
lookup <- unique(df[!is.na(df$Age),][c('Customer_ID', 'Age')])
df[is.na(df$Age),]$Age <- lookup[match(df[is.na(df$Age),]$Customer_ID,
lookup$Customer_ID),]$Age
我有一个包含特征 Date
、Age
和 Customer_ID
的数据集。 Age
中的某些行中有缺失值 (NA),我想估算它们。
这是一些示例数据:
Date <- c("201101", "201102", "201101", "201102", "201103")
Age <- c("12-17", "12-17", "30-35", NA, NA)
Customer_ID <- c("1234", "1234", "5678", "5678", "5678")
df <- data.frame(Date, Age, Customer_ID)
Date Age Customer_ID
201101 12-17 1234
201102 12-17 1234
201101 30-35 5678
201102 NA 5678
201103 NA 5678
我想用 30-35 替换 Age
中的 NA。
因此对于所有的 NA,它必须检查是否有另一行具有相同的 Customer_ID
并将 NA 替换为另一行中所述的 Age
的值。
关于如何做到这一点有什么想法吗?谢谢。
您可以使用 tidyr
中的 fill
函数。它是一个 tidyr
函数,用于 上次观察结转 ,即用先前的非 NA 值填充 NA 值。为了使其工作,您可以使用 arrange
对 column2 进行排序,该列将 NA
值排序在非 NA 后面,然后您可以按客户 ID 分组并填充 Age
列:
library(dplyr)
library(tidyr)
df %>% arrange(Age) %>% group_by(Customer_ID) %>% fill(Age)
# Source: local data frame [5 x 3]
# Groups: Customer_ID [2]
# Date Age Customer_ID
# <fctr> <fctr> <fctr>
# 1 201101 12-17 1234
# 2 201102 12-17 1234
# 3 201101 30-35 5678
# 4 201102 30-35 5678
# 5 201103 30-35 5678
基数 R:
lookup <- unique(df[!is.na(df$Age),][c('Customer_ID', 'Age')])
df[is.na(df$Age),]$Age <- lookup[match(df[is.na(df$Age),]$Customer_ID,
lookup$Customer_ID),]$Age