我是一个长期潜伏在论坛上的人,也是第一次发帖.对于我帖子中的任何不足之处,我提前表示歉意.这是一个相当复杂的问题.

描述: 我有一个从各种来源收集的科学怪人数据集.它包含一组不一致的公司ID变量,总共18个.假设我对一家公司有5个观察;我可能有2个、2个、10个或16个标识符.有一些重叠;其余的都不见了(NA).我想收回丢失的ID,所以我理想的情况是有18、18、18、18、18或16个,这取决于我对每家公司的覆盖范围.

问题描述: 现在,这是一个面板数据集,它增加了额外的复杂性.公司合并,移动,并随着时间的推移改变法律状态.并非所有的ID变量都将以相同的方式处理这些变量,因此ID变量的ID代码可能会根据观察时间而变化.我想过滤掉这些情况,因为我不能确定要使用的正确ID.

方法: 我已经try 遍历每个变量的数据(假设我可以在填充空格时 Select 几个额外的匹配项).我按每个ID变量对观察值进行分组,并确定每个变量有多少不同的观察值.如果对任何相应的ID变量有超过1个不同的观察,我认为存在冲突.如果只有1,我假定没有冲突,并试图填充缺失的值.然而,我的代码似乎不能正确循环,丢失了可能会出错的数据.

Sample Data:

### Not ID 1 should be imputable while ID 2 should not
data <- data.frame(ID = c(1, 1, NA, 2, NA, 2, 2, 2)
ID_Variable_1 = c(10, 10, NA, 20, 20, 20, 19, 18),   
ID_Variable_2 = c(NA, 8, 8, 16, 16, 16, NA, NA),   
ID_Variable_3 = c(NA, 8, 8, NA, 10, NA, NA, NA)   
ID_Variable_4 = c(A10, NA, NA, NA, NA, B12, B12, B12)
Current attempt:
### Extract vector of variables names
column_vector <- names(data) 

### Set Function to impute data
Impute_missing_data <- function(data, column_vector){   

#### Back-up data
temp_data <- data  

#### Loop through each variable
for (i in column_vector) {

#### Identify unique ID combinations, filter out those which contain conflicts
imputation_candidates <- temp_data %>%       
group_by_at(vars(i)) %>%       
summarise(across(everything(), ~ n_distinct(., na.rm = TRUE))) %>%       
filter(if_all(-i, ~ . <= 1), .preserve = TRUE)

#### Copy vector of IDs with imputable data
imputation_applying <- imputation_candidates\[\[i\]\] 

#### Update temporary data with imputable data. As all IDs are the same update based on the first non-NA
temp_data <- temp_data %>%       
group_by_at(vars(i)) %>%       
mutate(across(everything(), ~ ifelse(.x %in% imputation_applying & is.na(.), first(.x[!is.na(.x)]), .x))) %>% ungroup()   
}   

#### Return updated data
return(temp_data) 
}
Desired Output:
data_temp <- data.frame(ID = c(1, 1, 1, NA, 2, NA, 2, 2, 2)
ID_Variable_1 = c(10, 10, 10, 11, 20, 20, 20, 19, 18),   
ID_Variable_2 = c(8, 8, 8, ,12, 16, 16, 16, NA, NA),   
ID_Variable_3 = c(8, 8, 8, NA, NA, 10, NA, NA, NA)   
ID_Variable_4 = c(A10, A10, A10, NA, NA, NA, B12, B12, B12)

推荐答案

data %>% 
    rownames_to_column()%>%
    rows_patch(filter(fill(., everything(), .direction = 'downup'), ID == 1))%>%
    column_to_rownames()

Matching, by = "rowname"
  ID ID_Variable_1 ID_Variable_2 ID_Variable_3 ID_Variable_4
1  1            10             8             8           A10
2  1            10             8             8           A10
3  1            10             8             8           A10
4  2            20            16            NA          <NA>
5 NA            20            16            10          <NA>
6  2            20            16            NA           B12
7  2            19            NA            NA           B12
8  2            18            NA            NA           B12

R相关问答推荐

按崩溃类别分类的指数

创建重复删除的唯一数据集组合列表

R的GG平行坐标图中的排序变量

获取一个数据库框架的摘要,该数据库框架将包含一列数据库框架,

如果行和大于值,则过滤

将嵌套列表子集化为嵌套列表

无法定义沿边轨迹的 colored颜色 渐变(与值无关)

从多个线性回归模型中提取系数

按多列统计频次

派生程序包| ;无法检索';return()';的正文

如何移除GGPlot中超出与面相交的任何格网像元

将多个变量组合成宽格式

R中的类别比较

在使用具有Bray-Curtis相似性的pvCluust时计算p值

使用来自嵌套列和非嵌套列的输入的PURRR:MAP和dplyr::Mariate

在生成打印的自定义函数中,可以通过变量将线型或 colored颜色 设置为NULL吗?

Ggplot2如何找到存储在对象中的残差和拟合值?

R将函数参数传递给ggploy

GOGPLATE geom_boxploy色彩疯狂

Ggplot2:添加更多特定 colored颜色 的线条