首页 > 解决方案 > 根据其他列中的值应用函数

问题描述

我有一个数据框,每个唯一 ID 包含 10 个观察值和一些其他变量。不幸的是,对于我想通过向前携带最后一个观察值(通过 zoo 包的 na.locf 函数)来替换的特定列的数据有一些缺失值(NA)。

问题是,我需要为每个唯一用户执行此功能,因此我需要为每个唯一 ID“拆分”数据帧,然后应用该功能,同时保留所有其他列。我尝试了以下方法,但这不起作用:

df %>%
  group_by(ID) %>%
  group_split() %>%
  lapply(Location, na.locf() %>%
  bind_rows

数据集的可重现示例:

ID <- rep(1:5, each = 10)
Age <- sample(18:65, 50, replace = TRUE)
Locations <- c("Europe", "Asia", NA)
Location <- sample(Location, 50, replace = TRUE)
df <- data.frame(ID, Age, Location)

标签: rdplyr

解决方案


使用group_bythen na.locf,可以na.rm=FALSE选择保持输出的长度:

library(dplyr)
df <- df %>% group_by(ID) %>% 
mutate(Location=zoo::na.locf(Location, na.rm=FALSE))

正如 Martin 评论的那样,如果系列以给定 ID 的缺失值开头,则不会被填充。此脚本不会失败,即使该系列以缺失开头。例如:

df <- tibble(ID=c(1, 1, 2, 2), Location=c(NA,"Europe","Asia",NA))
df %>% group_by(ID) %>% mutate(Location2=zoo::na.locf(Location, na.rm=FALSE))

返回:

# A tibble: 4 x 3
# Groups:   ID [2]
     ID Location Location2
  <dbl> <chr>    <chr>    
1     1 <NA>     <NA>     
2     1 Europe   Europe   
3     2 Asia     Asia     
4     2 <NA>     Asia     

推荐阅读