r - 根据其他列中的值应用函数
问题描述
我有一个数据框,每个唯一 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)
解决方案
使用group_by
then 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
推荐阅读
- scala - spark UDF 不接受数组
- javascript - 忽略对“打印()”的调用。该文档是沙盒的,并且未设置“allow-modals”关键字。如何解决这个问题?
- javascript - 鼠标悬停在 div 项目上时如何在地图中显示标记位置 - 例如 AirBnb
- node.js - 不需要模块,但得到:找不到模块“模块名称”的声明文件。'/path/module-name.js' 隐含一个 'any' 类型
- c++ - VS Code 找不到我的#include 文件 - 尝试了所有可能的方法
- javascript - Axios 调用后无法附加 div
- php - 即使在提交表单时从列表中选择任何值后,状态列表下拉列表也会给出第一个值
- python - 如何使用 python 向代理发送 FIXML 消息?
- c# - C# 中的 ConcreteClass 中的项目不能与 GET 和 POST 调用一起正常工作
- javascript - 如何使用反应条件更新useState-hook?