我对R相当陌生.我已经搜索了好几个小时,并向对R有更多经验的同事寻求帮助,但仍然没有找到解决方案.我确实找到了一个related thread here,它提供了一些灵感,但我不知道如何扩展该方法来解决我的问题.
Overview
我有一个包含1800多个变量的数据集.问题是,该数据集包含两组140个变量,这些变量具有不同的数据,这些数据是在同一调查因自动化错误而在两个不同的时间点意外进行时创建的.数据库创建了同一变量的两个版本.我正在try 索引一个唯一的列,以判断该行的值是否为"NA",如果是,那么我想用第二组140列中的值填充它,并覆盖原始140列中的值.如果行不是"NA",那么我希望它保持原样.
Dummy Data Set
基于下面的虚拟集,我试图判断"week0date\u v2",看看它是否是给定行的NA值.如果是,则从"week0date"到"var3"的列中获取该行中的值,并将这些值写入"week0date\u v2"到"var3\u v2"的列中的同一行.如果给定行的值不是NA,则保留原始数据.
library('tidyverse')
dummy_data<- data.frame(
id = c(1,2,3,4,5,6),
week0date_v2 = c("2022/2/1", NA, "2022/2/15", "2022/2/18", "2022/2/15", NA),
var1_v2 = c(75,NA,66,NA,65,NA),
var2_v2 = c(19,NA,67,10,54,NA),
var3_v2 = c(NA,NA,99,125,73,NA),
verify_v2 = c(1,NA,1,1,1,NA),
week0date = c(NA, "2022/3/2", "2022/4/15", "2022/4/18", NA, "2022/4/15"),
var1 = c(NA,52,NA,63,NA,75),
var2 = c(NA,78,NA,NA,NA,63),
var3 = c(15,64,25,NA,20,13),
verify = c(NA,1,NA,1,NA,1)
)
dummy_data <- dummy_data %>% mutate_if(is.character, as.Date)
id week0date_v2 var1_v2 var2_v2 var3_v2 verify_v2 week0date var1 var2 var3 verify
1 1 2022-02-01 75 19 NA 1 <NA> NA NA 15 NA
2 2 <NA> NA NA NA NA 2022-03-02 52 78 64 1
3 3 2022-02-15 66 67 99 1 2022-04-15 NA NA 25 NA
4 4 2022-02-18 NA 10 125 1 2022-04-18 63 NA NA 1
5 5 2022-02-15 65 54 73 1 <NA> NA NA 20 NA
6 6 <NA> NA NA NA NA 2022-04-15 75 63 13 1
Current Thinking
我try 了多种方法,但都没有成功.
我的同事和我首先try 将其用于单个变量(仅"week0date\u v2"列),我们可以使用下面的mutate()和case\u when()方法来实现这一点:
dummy_data_first_attempt <- dummy_data %>%
mutate(
week0date_v2 = case_when(
!is.na(week0date_v2) ~ week0date_v2,
is.na(week0date_v2) ~ week0date
))
我不知道如何将上述方法扩展到"week0date\u v2"到"var3\u v2"的列范围内.我try 编写一个函数来实现这一点,但我编写函数的技能还不够.
如果您能帮助我们扩展以上内容,以达到以下预期效果,我们将不胜感激!!!
Desired Outcome
这就是我希望得到的结果(即,当"week0date\u v2"中的给定行为NA时,从"week0date"到"var3"的值被复制并粘贴到"week0date\u v2"到"var3\u v2"中……否则保留原始数据)
dummy_data_wrangled <- data.frame(
id = c(1,2,3,4,5,6),
week0date_v2 = c("2022/2/1", "2022/3/2", "2022/2/15", "2022/2/18", "2022/2/15", "2022/4/15"),
var1_v2 = c(75,52,66,NA,65,75),
var2_v2 = c(19,78,67,10,54,63),
var3_v2 = c(NA,64,99,125,73,13),
verify_v2 = c(1,NA,1,1,1,NA),
week0date = c(NA, "2022/3/2", "2022/4/15", "2022/4/18", NA, "2022/4/15"),
var1 = c(NA,52,NA,63,NA,75),
var2 = c(NA,78,NA,NA,NA,63),
var3 = c(15,64,25,NA,20,13),
verify = c(NA,1,NA,1,NA,1)
)
dummy_data_wrangled
id week0date_v2 var1_v2 var2_v2 var3_v2 verify_v2 week0date var1 var2 var3 verify
1 1 2022/2/1 75 19 NA 1 <NA> NA NA 15 NA
2 2 2022/3/2 52 78 64 NA 2022/3/2 52 78 64 1
3 3 2022/2/15 66 67 99 1 2022/4/15 NA NA 25 NA
4 4 2022/2/18 NA 10 125 1 2022/4/18 63 NA NA 1
5 5 2022/2/15 65 54 73 1 <NA> NA NA 20 NA
6 6 2022/4/15 75 63 13 NA 2022/4/15 75 63 13 1