r - 处理发生在同一日期的值
问题描述
如何在同一数据框中的两个不同列之间查找同一日期出现的值。删除 A01_CD 列中出现的值并将其替换为 NA。如果 A01_CD 有值,则应将其移至 A01,而 NA 应放置在 A01 中。我一直在尝试使用重复()和唯一()和ifelse,但我失败了。请协助。
我的数据框
Date A01 A01_CD
1 1966/05/07 4.870000 4.870
2 1966/05/08 4.918333 NA
3 1966/05/09 4.892000 4.860
4 1966/05/10 4.858917 NA
5 1966/05/11 4.842000 NA
211 1967/03/18 NA 5.95
期望的结果
Date A01 A01_CD
1 1966/05/07 4.870000 NA
2 1966/05/08 4.918333 NA
3 1966/05/09 4.892000 NA
4 1966/05/10 4.858917 NA
5 1966/05/11 4.842000 NA
211 1967/03/18 5.95 NA
解决方案
一个选项coalesce
将返回作为每行参数给出的不同列中的第一个非 NA 元素
library(dplyr)
df1 %>%
transmute(Date, A01 = coalesce(A01, A01_CD), A01_CD = NA_real_)
# Date A01 A01_CD
#1 1966/05/07 4.870000 NA
#2 1966/05/08 4.918333 NA
#3 1966/05/09 4.892000 NA
#4 1966/05/10 4.858917 NA
#5 1966/05/11 4.842000 NA
#6 1967/03/18 5.950000 NA
或base R
使用行/列索引
df1$A01 <- df1[-1][cbind(seq_len(nrow(df1)), max.col(!is.na(df1[-1]), 'first'))]
df1$A01
#[1] 4.870000 4.918333 4.892000 4.858917 4.842000 5.950000
数据
df1 <- structure(list(Date = c("1966/05/07", "1966/05/08", "1966/05/09",
"1966/05/10", "1966/05/11", "1967/03/18"), A01 = c(4.87, 4.918333,
4.892, 4.858917, 4.842, NA), A01_CD = c(4.87, NA, 4.86, NA, NA,
5.95)), class = "data.frame", row.names = c("1", "2", "3", "4",
"5", "211"))
推荐阅读
- ios - 如何从原生 ios 视图弹回颤振视图?
- android - 如何修复 android media CursorLoader 无法检测数据文件夹中的媒体文件
- amazon-web-services - AWS DynamoDB。我是否过度使用了我的写入容量?
- angular - 授权不记名令牌Angular 6不起作用
- angular - rxjs 获取正在输入的人员列表
- excel - 比较VBA中列单元格的值
- docker - 如何在单个图像中执行此操作 - Docker 容器。请提出一个简单的方法,因为我是 Docker 新手
- c++ - 转换 VS 2010 和 2015 之间的差异
- neo4j - Neo4j 中特定 DBMS 的连接问题 localhost7474
- scala - Scala:如何将任何通用序列作为此方法的输入